gpt4 book ai didi

unity3d - 你什么时候乘以 Unity 中的 Time.deltaTime?

转载 作者:行者123 更新时间:2023-12-03 23:26:38 24 4
gpt4 key购买 nike

关于何时应该或不应该将数量乘以 Time.deltaTime ,似乎有很多令人困惑/矛盾的建议。所以我想知道, 与 Unity 物理系统有关,你应该什么时候乘以 Time.deltaTime
我知道 Time.deltaTime 用于使某些 Action 与帧速率无关,但在某些情况下,不清楚 Action 是否与帧速率无关。例如:

  • 在 FixedUpdate 中执行 rigidbody.velocity += acceleration*Time.deltaTime;。由于 FixedUpdate 以恒定时间步长运行,这是否使乘以 Time.deltaTime 变得不必要?
  • 正在做 rigidbody.AddForce(force*Time.deltaTime, forceMode); 。各种 ForceMode 是如何影响这一点的?

  • 我已经看到了针对个别情况的解决方案,但如果有一种简单的直觉可以解决所有这些情况,那就太好了。

    最佳答案

    直觉
    乘以 Time.deltaTime 用于使 瞬时 操作以 连续 (或“平滑”)方式运行。
    瞬时操作会导致某个数量“跳”到不同的值。以下操作是 瞬时 :

  • Rigidbody.[position|velocity|rotation|angularVelocity] += x;
  • Rigidbody2D.[position|velocity|rotation|angularVelocity] += x;
  • Rigidbody.Add[Force|Torque](x, ForceMode.[Impulse|VelocityChange]);
  • Rigidbody2D.Add[Force|Torque](x, ForceMode2D.Impulse);

  • 以上所有操作都会导致数量立即通过 x 跳转,而不管帧的长度如何。
    相比之下,以下操作是 连续 :
  • Rigidbody.Add[Force|Torque](x, ForceMode.[Force|Acceleration]);
  • Rigidbody2D.Add[Force|Torque](x, ForceMode.Force);
  • Rigidbody.velocity = x;(从 Rigidbody.position 的角度来看是连续的。即设置速度不会使 Rigidbody.position 突然跳到一个新值)

  • 以上所有操作都应用于整个框架的过程(至少在概念上会发生这种情况;物理系统在内部所做的事情超出了本答案的范围)。为了说明这一点, Rigidbody.AddForce(1, ForceMode.Force) 将在整个帧中对对象施加 1 牛顿的力;不会出现位置或速度的突然跳跃。
    那么什么时候乘以 Time.deltaTime 呢?
    如果您使用 连续 操作,您几乎肯定应该是 而不是 乘以 Time.deltaTime 。但是,如果您使用的是 瞬时 操作,则答案取决于该操作是否以连续方式使用。
    示例 1:爆炸
    void Explode() {
    rigidbody.velocity += explosionAcceleration;
    }
    在这里你应该 而不是 乘以 Time.deltaTime 因为 Explode() 只被调用一次。它并不意味着应用于一系列帧。
    示例 2:移动
    void Update() {
    rigidbody.position += velocity * Time.deltaTime;
    }
    在这里,您必须乘以 Time.deltaTime,因为对象应该随时间连续移动,而且您还使用了瞬时操作。请注意,这可以用连续操作代替,并且不需要乘以 Time.deltaTime :
    void Update() {
    rigidbody.velocity = velocity;
    }
    尽管这并不完全等同于原始值,因为它忽略了 rigidbody.velocity 的先前值。
    示例 3:加速
    void Update() {
    rigidbody.AddForce(acceleration*Time.deltaTime, ForceMode.VelocityChange);
    }
    在这里,您应该乘以 Time.deltaTime,因为您希望速度以一致的速率逐帧增加。请注意,这完全等同于:
    void Update() {
    rigidbody.AddForce(acceleration, ForceMode.Acceleration);
    }
    此代码在整个帧的过程中应用加速度。这段代码(在我看来)也更清晰、更容易理解。 FixedUpdate 呢?
    FixedUpdate 中不会影响上述任何建议。是的,理论上你可以不乘以 Time.deltaTime ,因为帧之间的时间总是相同的。但是你所有的单位都必须依赖于固定的帧速率。因此,例如,如果您想以每秒 1 m/s 帧的 60 速率移动,则必须将 1/60=.01666 添加到每帧的位置。然后想象一下如果你改变你的固定时间步长会发生什么。您将不得不更改一堆常量以适应。
    FixedUpdate 中执行代码不会突然使该代码帧率独立。您仍然必须采取与 Update 相同的预防措施。
    作为旁注,您不需要用 Time.deltaTime 中的 Time.fixedDeltaTime 替换 FixedUpdate,因为 Unity 已经进行了这种替换。
    结论
    如果您希望瞬时操作在一系列帧上平滑运行,则仅乘以 Time.deltaTime
    很多时候,您可以通过使用连续操作来避免使用 Time.deltaTime,这通常更直观(参见示例 2 和示例 3)。但这当然取决于上下文。

    关于unity3d - 你什么时候乘以 Unity 中的 Time.deltaTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63604203/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com