开发者运动 (Motion for developers)
FixedUpdate 的执行顺序
在为驱动器开发自定义行为模型时,理解 FixedUpdate 的执行顺序对于确保正确的行为和性能至关重要。
- 物理更新周期:所有 驱动器行为 (drive behavior) 计算和设置新驱动器位置都在 Unity 的物理更新周期内进行。默认情况下,此周期设置为 20ms,但可以根据性能和计算需求在 Unity 设置中调整。
- FixedUpdate 顺序:Unity 在每个物理周期内执行所有脚本的 FixedUpdate 方法。但是,这些 FixedUpdate 的执行顺序不受保证。这意味着一个脚本 (Script1) 中的 FixedUpdate 可能在另一个脚本 (Script2) 中的 FixedUpdate 之前或之后调用。
- 依赖管理:对于依赖于其他组件的行为模型——例如齿轮 (Gear) 或凸轮 (CAM)](/components-and-scripts/motion/cam.md)——必须按特定顺序计算依赖关系。例如,主驱动器 (master Drive) 应在其从属驱动器 (slave Drive) 之前计算。此外,主驱动器的行为模型需要在主驱动器位置更新之前处理。
为确保正确的顺序,每个 Drive 实现以下行为:
- 驱动器行为执行:每个 Drive 调用所有附加的实现了
IDriveBehavior接口的驱动器行为的CalcFixedUpdate。 - 行为模型计算:附加的行为模型可以修改 Drive 的公共属性以控制其状态,或直接设置 Drive 的
CurrentPosition。 - 位置更新:Drive 然后将其位置更新为
CurrentPosition。 - 子驱动器计算:Drive 的所有子驱动器将调用其 CalcFixedUpdate(见下文)。
子驱动器 (Subdrives)
某些 Drive 作为主 Drive 的子驱动器运行,例如齿轮或凸轮的情况。
为确保正确行为,这些驱动器需要实现 IDriveBehavior 接口。此外,在 Start 方法中,子驱动器必须调用 MasterDrive.AddSubDrive(thisDrive)。此设置确保子驱动器不运行自己的 FixedUpdate,而是等待主 Drive 调用 CalcFixedUpdate,如上所述。
设置驱动器位置
如前所述,在 Drive 和 Drive Behavior 执行周期内,Drive Behavior 可以设置公共属性 CurrentPosition。由于上述顺序,此方法确保位置正确更新。
Drive 上还有一个公共方法 SetPosition(float position)。当调用此方法时,Drive 会再次设置其位置,即使上述顺序中该 Drive 在同一 FixedUpdate 周期中已经完成。
重要提示: 直接调用 SetPosition 不是推荐的方法。最好通过附加到 Drive 的行为模型中的 IDriveBehavior 接口来实现您的逻辑。此方法确保 Drive 位置更新以受控和可预测的方式进行,遵循已建立的 FixedUpdate 顺序。
驱动器事件 (Drive Events)
Drive 有两个关键事件,您可以利用它们挂钩到其更新顺序中:
- OnBeforeDriveCalculation: 此事件在 Drive 开始计算其行为模型和更新其位置之前触发。这是在 Drive 主要计算之前注入自定义逻辑或进行调整的理想点。
- OnAfterDriveCalculation: 此事件在 Drive 完成所有行为模型计算并更新其位置之后、但在任何子驱动器 (SubDrive) 计算之前调用。这允许您在主 Drive 更新之后但在整体更新顺序内进行进一步修改或执行操作。
通过使用这些事件,您可以有效地将自定义行为或调整集成到 Drive 的更新过程中。
