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

问题描述 投票:0回答:1

我正在用Unity开发一个简单的2D游戏 Unity (球打砖头),所以我有一个球,我想发射球来打砖头,现在要发射球,我必须设置为 Velocity 在...上 RigidBody 组件连接到球的GameObject上。

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

方法一:

在Start()方法中设置速度。

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

方法2.写一个FixedUpdate()方法。

写一个FixedUpdate()的方法,然后在里面放上语句。 因为。

当使用Rigidbody时使用FixedUpdate(Unity)。文件)

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. 所以: FixedUpdate() 方法,检查是否有 false 值,并且每帧都返回?
  2. 在这种情况下,这两种方法哪种性能更好?
c# unity3d rigid-bodies
1个回答
1
投票

如果有一个FixedUpdate()方法来检查是否有假值,并在每一帧中返回,成本是否很高?

像你这样简单的布尔条件并不贪婪,所以不用担心这个问题。然而,任何一行代码的运行都会降低你的性能。Update()方法本身就比你的 "琐碎 "条件在性能上更贪婪。禁用你的组件脚本或删除对象本身比让它白白运行更优化。只要记住这一点:)

在这种情况下,这两种方法哪种性能更好?

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

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

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

因为Update()在每一帧都会被调用,所以如果你的电脑以100帧的速度运行,Update()会被调用100次。如果你的电脑以200帧的速度运行,它将被调用200次。这在某些情况下是有点问题的,特别是当你与物理组件交互时。为了理解这个问题,让我们承认我们想给刚体施加一个力(rb.AddForce(100))。如果你在Update()方法中调用它,而你的pc以100fps的速度运行,你将在一秒钟内施加10000个力。然而,如果你的电脑以50 fps的速度运行,那么你将在一秒钟内施加5000力。这将会导致一些奇怪的行为,而这些行为是可以避免的,这要感谢FixedUpdate(),它以每秒固定的次数被调用 (团结证). 然而,如果你不想修改你的刚体组件,使用FixedUpdate()是没有意义的。他们告诉你 如果您想更新您的刚体组件你应该在FixedUpdate方法中进行,而不是在Update()中进行。

所以对于你的问题,你可以简单的做以下操作。

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

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

希望我帮到你,祝你项目顺利!

© www.soinside.com 2019 - 2024. All rights reserved.