Unity中的Update和FixedUpdate有什么区别,我应该打扰吗?


10

有人告诉我将其Update()用于图形和FixedUpdate()物理学,但有时当我使用时,我的输入将不会注册FixedUpdate()。如果我将Update()所有内容都使用,它会很好地工作。

我应该打扰一下FixedUpdate(),还是我做错了什么?

Answers:


10

FixedUpdate可以比Update您的设置更快或更慢地运行。这取决于负载(Update运行速度)和设置的速度FixedUpdate(位于“编辑”->“项目设置”->“时间”中)。理想情况下,由于Update每帧运行一次,因此您要在其中捕获输入。如果您需要对FixedUpdate方法中的输入进行操作(例如控制物理物体),请在中设置标志,Update然后在中进行处理FixedUpdate

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

从该FixedUpdate方法控制物理仍然是一个好主意,因为不太可能需要经常更新物理,并且固定更新的物理比可变更新的物理更容易预测(确定性)。


如果需要从轴(Input.GetAxis(“ Horizo​​ntal”))读取值而不是布尔条件(es.GetMouseButtonDown),该怎么办?如果更新执行的次数超过了FixedUpdate,那么在这种情况下您有何建议?我们是否应该最终考虑将几次更新期间发生的轴的平均值计算为Update,然后再将其使用?(+1 btw)
Heisenbug 2014年

如何找出我的FixedUpdate有多快?
Tokamocha 2014年

1
@Tokamocha固定更新的速率在“编辑”->“项目设置”->“时间”中设置。
MichaelHouse

@Heisenbug就我个人而言,我只使用最后一个值,看看效果如何。如果得到意外结果,则可以计算轴值的移动平均值,直到由处理FixedUpdate。这是需要进行游戏测试才能真正弄清“感觉”正确的事情之一。
MichaelHouse

1
我在最近的测试中发现,与文档中暗示的相反,FixedUpdate中已经提供了新的输入标志(至少在PC上)。因此,相对于直接处理FixedUpdate中的输入,在Update中设置一个标志,然后在此后的下一个FixedUpdate中(例如,下一帧)对其进行操作,实际上可以为游戏增加一帧延迟。尽管需要避免在具有多个FixedUpdates的框架上进行双重处理输入,或者在没有FixedUpdate的框架上缺少输入,但这确实需要谨慎
DMGregory

7

您需要了解每个人的工作。Update()无论哪种方式,都会被尽可能频繁地调用(不确定,也许可以设置上限)。FixedUpdate()在每个固定的时间被调用(因此“固定”)。

输入输入就Update()这么简单(因为您注意到FixedUpdate()可能无法捕获输入事件)。但是,游戏逻辑可能会陷入其中任何一种。物理学必须是确定性的,这就是为什么它应该存在FixedUpdate()。其他事情不必。根据用途,您必须确定合适的功能。

值得一提的是,有些应用程序的所有游戏逻辑更新都在内部FixedUpdate()(甚至在之外Unity),这称为“固定步骤游戏循环”。将所有更新代码包含在固定的步进函数中,可以为您提供确定性,并使您的应用每次(在每个设备上)更可能以相同的方式运行。还允许一些精美的功能,例如重播。


因此,如果我将所有内容都放入FixedUpdate()中,我的游戏仍将注册所有输入,对吗?
Tokamocha 2014年

1
不,您可以在其中放置所有游戏逻辑更新,但不能输入检查。
NPS

2
这个答案充满了错过信息。首先FixedUpdate的被调用每1 / fixedDeltaTime次第二,并不是每个n阶fixedDeltaTime。其次,游戏逻辑应始终在FixedUpdate中使用,因为它使推理变得更容易。更新仅用于渲染目的(我知道Unity社区中几乎没有人遵循此方法,但这确实是应该这样做的方式)。第三,FixedUpdate及其与物理引擎的关系与确定性无关。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.