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
在我第一次投篮后。
这将在每个固定帧速率帧发生,我猜这对于仅设置一次速度来说是昂贵的。
所以:
- 每帧检查
false
值和 returns 的 FixedUpdate()
方法是否昂贵?
- 在这种情况下,这两种方法中哪种表现更好?
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;
}
希望对您有所帮助,祝您项目顺利!
我正在 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
在我第一次投篮后。
这将在每个固定帧速率帧发生,我猜这对于仅设置一次速度来说是昂贵的。
所以:
- 每帧检查
false
值和 returns 的FixedUpdate()
方法是否昂贵? - 在这种情况下,这两种方法中哪种表现更好?
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;
}
希望对您有所帮助,祝您项目顺利!