Transform.up工作,1秒后-transform.up不能正常工作? C#Unity

时间:2015-12-17 23:19:09

标签: c# unity3d

如果您需要更多上下文,请告诉我们。踢球计时器本身很好用。我试图这样做,以便在对象被踢到位之后一秒钟,它将以相反的方式踢回来。

subView

这样做的结果是,如果没有附加反冲功能,物体会比平时少。物体确实会反弹,但是在随机时间,而不是在它们踢起来后1秒钟。任何人都可以看到这个问题吗?

2 个答案:

答案 0 :(得分:1)

当球被踢到空中时,计时器被重置,并且nextKick也被更改,因此在nextKick + 1发生时,您已经将nextKick的值更改为随机值。我想你想要的是public static IEnumerable<T> YieldMe<T>(this T obj) { yield return obj; } 仅在第二个if语句之后/在回扣发生之后发生。

nextKick = Random.Range (MinKickTime, MaxKickTime);

您也可以使用一个计时器

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);
    }
} 

答案 1 :(得分:1)

你可能想做的是使用一个回拨时间队列,可以定义为:

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

此外,我建议不要重置踢球计时器,但要有一个踢/踢回时间刻度,以便于参考。

最后,请考虑使用Time.deltaTime代替Time.fixedDeltaTime,因为它会自动返回正确类型的增量时间,如Unity Documentation中所述。

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

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();
    }
  }
}

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

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