每个 组件 在 Roblox 引擎中对应一个 刚体。每个刚体的位置和速度描述了它的位置和移动速度,更新每个组件的位置和速度是引擎的主要任务之一。
组件可以通过 机械约束 和 移动约束 连接在一起,形成诸如汽车或飞机的机制。随着机制中组件和约束的数量增加,模拟机制所需的时间也会增加。幸运的是,当睡眠系统确定引擎可以跳过对静止组件的模拟时,这种增加会被抵消。
睡眠状态
每个组件可以处于以下三种状态之一:清醒、睡眠 或 睡眠检查。
清醒
清醒的组件正在移动或加速,因此会被模拟。组件从 睡眠 和 睡眠检查 中的情况进入此状态,以及 额外的唤醒情况。
睡眠
睡眠中的组件既不移动也不加速,因此不被模拟。
通过检查其 线性速度 和 旋转速度 来判断组件是否静止。如果其线性速度低于 线性速度 阈值,并且其旋转速度低于 旋转速度 阈值,则该组件被认为是静止的。
在某些情况下,仅检查非移动状态可能会导致组件错误地进入睡眠状态。例如,如果一个球被直向抛出,随着其到达最大高度,其速度接近零,可能会使其进入睡眠状态而永远不会落下。为了处理这种情况,引擎会考虑如果其 线性加速度 或 旋转加速度 大于 线性加速度 和 旋转加速度 阈值,则该组件正在加速,并会阻止其进入睡眠状态。
睡眠检查
与至少一个 清醒 邻近组件共享约束的非移动组件进入 睡眠检查 状态,并且不被模拟。在每个世界步骤中,睡眠检查组件会检查以下内容:
- 它的 线性加速度 是否大于 唤醒线性加速度 阈值。
- 它的 旋转加速度 是否大于 唤醒旋转加速度 阈值。
- 邻近组件的 线性速度 是否大于 邻近线性速度 阈值。
- 邻近组件的 旋转速度 是否大于 邻近旋转速度 阈值。
如果这些条件中的任何一个为真,或在任何 额外的唤醒情况 下,睡眠检查组件将进入 清醒 状态。
阈值参考
以下表格提供用于确定组件是否移动或加速的各种速度和加速度阈值。
| 阈值 | 值 | 状态变化 |
|---|---|---|
| 线性速度 | 0.33 studs/s | 清醒 ⟩ 睡眠 |
| 旋转速度 | 0.42 studs/s | 清醒 ⟩ 睡眠 |
| 线性加速度 | 0.24 studs/s² | 清醒 ⟩ 睡眠 |
| 旋转加速度 | 0.24 studs/s² | 清醒 ⟩ 睡眠 |
| 邻近线性速度 | 0.48 studs/s | 睡眠检查 ⟩ 清醒 |
| 邻近旋转速度 | 0.59 studs/s | 睡眠检查 ⟩ 清醒 |
| 唤醒线性加速度 | 16.9 studs/s² | 清醒 ⟩ 睡眠 |
| 唤醒旋转加速度 | 16.9 studs/s² | 清醒 ⟩ 睡眠 |
旋转速度和加速度阈值反映的是位于组件边界球体(包含组件中所有部件的球体)上的一个点的速度和加速度,该点与组件刚性运动。
施动关节
有时开发者希望使用 施动关节 以非常缓慢的速度移动部件,施动关节是一种施加力或运动以驱动连接部件的约束,例如使用 HingeConstraint 和 Motor。为了支持这些场景,连接到施动关节的组件使用更严格的睡眠速度阈值。这延迟了这些组件进入睡眠状态的时间,允许在不让物理系统提前让它们进入睡眠的情况下进行缓慢、可控的运动。
以下被视为施动关节:
额外的唤醒情况
除了 睡眠检查 和 睡眠 中阐明的情况外,当以下情况发生时,组件会进入 清醒 状态:
它与另一个以超过 1 studs/s 的速度移动的组件发生碰撞。
通过 ApplyImpulse()、ApplyImpulseAtPosition() 或 ApplyAngularImpulse() 对组件内的任何 BasePart 应用非零冲量。
Workspace 中的任何物理相关属性变化会影响组件的情况,包括:
创建一个新的 Constraint,其 Attachment 连接到组件内的 BasePart。
任何属性变化对于一个 Constraint,其 Attachment 连接到组件内的 BasePart。
对连接到组件内的 BasePart 的 Motor 的 CurrentAngle 属性的变化。
组件包含一个 VehicleSeat,其上坐着玩家角色。
组件在一个 BlastRadius 内的 Explosion 内。
调试可视化
在游戏测试期间,您可以通过在 3D 视口右上角的 可视化选项 小部件中切换 清醒部件 显示组件的睡眠状态。

启用后,模拟的部件将按照其当前睡眠状态进行轮廓显示,清醒 部件以红色轮廓显示,睡眠检查 部件以橙色轮廓显示,睡眠 部件则不进行轮廓显示。