Transform.up工作,1秒后的-Transform.up工作不好?C#Unity

本文关键字:工作 up C#Unity -Transform 1秒 Transform | 更新日期: 2023-09-27 18:27:11

如果您需要更多上下文,请告诉我。踢腿计时器本身就很好用。我试着让它在物体被踢到位一秒钟后,它会以相反的方式被踢回来。

void FixedUpdate()
{
    kickTimer += Time.fixedDeltaTime;
    if (kickTimer > nextKick) {
        rb.AddForce (transform.up * thrust, ForceMode.Impulse);
        kickTimer = 0;
        nextKick = Random.Range (MinKickTime, MaxKickTime);
    }
    kickBackTimer += Time.fixedDeltaTime;
    if (kickBackTimer > nextKick + 1) {
        rb.AddForce (-transform.up * thrust, ForceMode.Impulse);
        kickTimer = 0;
        nextKick = Random.Range (MinKickTime, MaxKickTime);
    }
} 

这样做的结果是,如果没有附加回踢功能,对象会比正常情况下踢得更少。这些物体确实会向后踢,但是随机的,在它们踢起后不到1秒。有人能看出这个问题吗?

Transform.up工作,1秒后的-Transform.up工作不好?C#Unity

您可能想在这里使用一个反冲时间队列,它可以定义为:

Queue<float> nextKickBacks = new Queue<float>();

此外,我建议不要重置踢球计时器,而是使用一个单独的踢球/回踢时间刻度,以便于参考。

最后,考虑使用Time.deltaTime而不是Time.fixedDeltaTime,因为它将自动返回正确类型的delta时间,如Unity文档中所述。

我相信,实现这一目标的一个巧妙方法是:

void FixedUpdate()
{
  // Increase the kick timer
  kickTimer += Time.deltaTime;
  // If the next kick time has came
  if (nextKick < kickTimer) {
    // Schedule the kick back corresponding to the current kick
    nextKickBacks.Enqueue(nextKick + 1);
    // Apply the kick force
    rb.AddForce(transform.up * thrust, ForceMode.Impulse);
    // Plan the next kick
    nextKick = kickTimer + Random.Range(MinKickTime, MaxKickTime);
  }
  // If there are more kick backs to go, and the time of the closest one has came
  if (0 < nextKickBacks.Count) {
    if (nextKickBacks.Peek() < kickTimer) {
      // Apply the kick back force
      rb.AddForce(-transform.up * thrust, ForceMode.Impulse);
      // Dequeue the used kick back time
      nextKickBacks.Dequeue();
    }
  }
}

还请注意,即使下一次踢球间隔低于1秒(这可能与您的旧概念有问题),这种方法也有效。

UPD:如果您希望踢球/踢球以改变的方式发生,请确保MinKickTime大于1。

当球被踢到空中时,计时器会重置,nextKick也会更改,因此当nextKick+1发生时,您已经将nextKick的值更改为随机值。我认为你想要的是nextKick = Random.Range (MinKickTime, MaxKickTime);只出现在第二个if语句之后/回扣发生之后。

void FixedUpdate()
{
    kickTimer += Time.fixedDeltaTime;
    if (kickTimer > nextKick) {
        rb.AddForce (transform.up * thrust, ForceMode.Impulse);
        kickTimer = 0;
    }
    kickBackTimer += Time.fixedDeltaTime;
    if (kickBackTimer > nextKick + 1) {
        rb.AddForce (-transform.up * thrust, ForceMode.Impulse);
        kickTimer = 0;
        nextKick = Random.Range (MinKickTime, MaxKickTime);
    }
} 

你也可以只使用一个定时器

void FixedUpdate()
{
    kickTimer += Time.fixedDeltaTime;
    if (kickTimer > nextKick) {
        rb.AddForce (transform.up * thrust, ForceMode.Impulse);
    }
    if (kickTimer > nextKick + 1) {
        rb.AddForce (-transform.up * thrust, ForceMode.Impulse);
        kickTimer = 0;
        nextKick = Random.Range (MinKickTime, MaxKickTime);
    }
}