在Unity3D中,FixedUpdate
和Update
是两个用于更新游戏状态的基本函数,但它们的调用时机和用途有所不同。
Update
-
Update
方法每帧都会被调用一次,用于执行大部分的游戏逻辑,如移动游戏对象、收集用户输入和其他非物理相关的操作。 -
Update
的调用频率与游戏的帧率相同,即在帧率变化时,Update
的调用频率也会变化。如果帧率较低,Update
会较少被调用;如果帧率较高,Update
会更频繁地被调用。 - 由于
Update
是基于帧率的,因此在其中处理移动时要小心,要记得使用Time.deltaTime
来确保运动平滑,并与具体的帧率解耦。
FixedUpdate
-
FixedUpdate
函数的调用是以固定的时间间隔进行的,通常用于处理物理相关的代码,比如应用力和其他物理计算。 -
FixedUpdate
的调用频率是固定的,与Time.fixedDeltaTime
(默认值通常是0.02秒,即每秒50次)设置的值有关,不受游戏帧率的影响。 - 由于物理引擎在
FixedUpdate
中更新,将物理计算放在这个函数内可以保持物理的一致性和稳定性,避免由于帧率波动导致的不确定行为。
使用场景比较
- 当你需要根据每一帧的时间变化做出反应,比如处理动画或者响应用户输入时,应该使用
Update
。 - 当你需要进行物理计算,比如添加力给刚体时,应该使用
FixedUpdate
。
示例
如果你在Update
中对刚体使用Rigidbody.AddForce
,那么在帧率较高时,刚体会接收到更多的力的添加调用,导致刚体行为与帧率相关,这显然是不希望看到的。相反,如果在FixedUpdate
中添加力,不论实际的帧率如何,刚体接收到的力都是一致的,因为FixedUpdate
和物理引擎更新的频率是匹配的。
注意事项
- 如果游戏逻辑放在
Update
中造成了性能瓶颈,使得帧率下降,那么可能会导致游戏逻辑执行不够流畅。在这种情况下,可能需要优化代码或者将一些计算分散到多个帧中进行。 - 如果帧率非常低,
FixedUpdate
可能会在一帧时间内被调用多次,以赶上物理模拟的步伐。这称为“FixedUpdate的追赶行为”,可能会导致在一帧内出现多个物理步骤的情况。这种情况下,可能需要考虑提升性能或调整Time.fixedDeltaTime
的值。