物理抖动
初级 程序员
物理引擎以固定的时间步长运行;物理引擎不会每帧更新物理,而是以固定频率更新,例如每秒 60 次。
Note
这是通过模拟设置中的 FixedTimeStep 属性控制的
你的游戏更新时机与物理更新时机之间的差异意味着你可能会看到物理对象或附加在物理对象上的东西以抖动的方式移动。它们之所以抖动,是因为在每次物理更新之后它们保持静止,而世界其余部分每一帧都在移动。
当你的帧率接近物理更新频率时,抖动会变得不那么明显,但由于帧率与物理之间无法实现完全同步,它总会偶尔发生抖动。
不过有一些方法可以解决这个问题。
刚体组件的插值模式
刚体有一个 Interpolation Mode 属性,该属性通过在每次物理更新之间插值刚体的位置和旋转来消除抖动。
Interpolated会获取物理引擎为该刚体设置的最近两次位置和旋转,并平滑地将对象从较旧的位置移动到较新的位置。这意味着与它的物理表示相比,对象始终"处于过去",因为它始终位于两个最近位置之间,而不是精确地位于最后一个位置。Extrapolated同样获取最近两次位置和旋转,但它不是处于两者之间,而是从最后一个位置开始并沿相同方向继续移动。如果对象的速度恒定,这会工作得很好;但如果它在该路径上突然发生碰撞,它会"自我修正",导致一些突然的运动。
物理对象跟随另一个对象时的抖动
在设置对象相对彼此移动时,可能会出现相当多的抖动问题。 以下是可能阻碍这些对象平滑移动的所有原因:
- 对象未设置为插值
- 你的逻辑没有在物理更新中运行,它会覆盖插值
- 你设置的是实体的位置/旋转,而不是物理对象的
LinearVelocity/AngularVelocity - 你的对象不是
Awake(唤醒)状态
最后,也许可以考虑改用约束。