Unity:在 FixedUpdate() 或 Start() 中设置 RigidBody 速度?

Unity: Set RigidBody velocity in FixedUpdate() or Start()?

我正在 Unity 中开发一个简单的 2D 游戏(球击中砖块),所以我有一个球,我想发射球来击中砖块,现在发射球我必须设置Velocity 在附加到球的 GameObject 的 RigidBody 组件上。

有两种方法可以做到这一点:

方法一:

在 Start() 方法中设置速度

private void Start()
{
    rb.velocity = direction * speed;
}

方法二:

编写一个 FixedUpdate() 方法并将语句放在那里。 因为:

Use FixedUpdate when using Rigidbody.(Unity Docs)

private void Start()
{
    _setVelocity = true;
}

private void FixedUpdate()
{
    if (!_setVelocity) return;

    rb.velocity = direction * speed;
    rb.angularVelocity = 0;
    rb.gravityScale = 0;
    _setVelocity = false;
}

但问题是:我不需要 FixedUpdate() 方法来做任何其他事情,因为我在脚本的生命周期内只发射一次球,所以在我发射球 unity 将继续 运行 FixedUpdate() 方法并每次检查 _setVelocity 的值和 return (退出),因为它总是 false 在我第一次投篮后。

这将在每个固定帧速率帧发生,我猜这对于仅设置一次速度来说是昂贵的。

所以:

  1. 每帧检查 false 值和 returns 的 FixedUpdate() 方法是否昂贵?
  2. 在这种情况下,这两种方法中哪种表现更好?

Is it expensive to have a FixedUpdate() method that checks for false value and returns every frame ?

像您这样的简单布尔条件并没有那么贪心,所以不用担心。但是,运行 的任何代码行都会降低您的性能。 Update() 方法本身在性能方面比 "trivial" 条件更贪婪。禁用您的组件脚本或删除对象本身比保留它 运行ning 更优化。请记住这一点:)

Which of the two methods performs better in this case ?

第一个更有效,因为你的速度是固定的,所以没有必要使用更新方法(Update() 或 FixedUpdate())。 你应该初始化刚体的速度直接在 Start() 方法中,就像在 post 中所做的那样,因此您可以摆脱布尔值及其条件。

Unity 的文档对 rigidbody 和 FixedUpdate() 非常清楚,但我的印象是您误解了某些方面。 他们告诉您,如果您想在 运行 时间内修改刚体的任何数据,最好使用 FixedUpdate() 而不是 Update() 以避免奇怪的行为。

但是为什么要使用 FixedUpdate() 而不是 Update() 呢?

因为 Update() 在每一帧都会被调用,所以如果您的电脑 运行 以 100 fps 的速度运行,Update() 将被调用 100 次。如果您的电脑 运行 以 200 fps 的速度运行,它将被调用 200 次。这在某些情况下有点问题,尤其是当您与物理组件交互时。
为了便于理解,我们承认我们想对刚体施加力 (rb.AddForce(100))。如果您在 Update() 方法中调用它并且您的 pc 运行s 以 100 fps 的速度调用,您将在一秒钟内施加 10000 次力。但是,如果您的电脑 运行s 为 50 fps,那么您将在一秒钟内施加 5000 次力。它会导致一些奇怪的行为,这要归功于 FixedUpdate() 可以避免,它以每秒固定的次数调用 (see unity doc)。
但是,如果您不想修改刚体组件,则没有必要将 FixedUpdate() 与它一起使用。他们告诉你如果你想更新你的刚体组件,你应该在 FixedUpdate 方法而不是 Update() 中进行。

所以对于您的问题,您可以简单地执行以下操作:

Awake() {
    // getting your components
    rb = GetComponent<Rigidbody2D>();
}

Start() {
    // initiliaze your components
    rb.velocity = direction * speed;
    rb.angularVelocity = 0;
    rb.gravityScale = 0;
}

希望对您有所帮助,祝您项目顺利!