Roblox 引擎中的每个 组装 对应于单个 刚性体 。每个刚性体的位置和速度描述它在哪里位置和移动速度,主要引擎任务之一是更新每个装配的位置和速度。
组件可以通过机械约束和传动约束连接在一起,形成汽车或飞机等机械机构。随着机制中的组件和约束数量增加,模拟机制所需的时间也会增加。幸运的是,当 睡眠系统 确定引擎可以跳过非移动装配的模拟时,这种增加将被抵消。
睡眠状态
醒来
一个 醒来 的装配正在移动或加速,因此被模拟。组件从以下情况中进入此状态:睡眠检查 和 睡眠 以及 额外的唤醒情况 。
睡眠检查
一个不移动的装配,与至少一个醒来的邻近装配共享约束,放入睡眠检查状态,不进行模拟。在每一步世界上,一个睡眠检查装配检查是否:
- 邻近装配的 位置偏移 大于邻近距离阈值。
如果这些条件之一是真实的,或者处于任何 额外唤醒情况 下,睡眠检查装配进入醒来状态。
睡眠
一个 睡眠 装配不移动也不加速,因此不被模拟。
组装决定不移动,通过检查其 位置偏移 来计算最大偏移量,即最近一组世界步中离其质量中心最远的点的平均位置。如果这一偏差大于运动阈值,装配进入醒来状态。
在某些情况下,仅检查非移动状态会导致组件错误地进入睡眠状态。例如,如果球被直接投向上空,其位置几乎在接近最大高度时才会发生微小的变化,使其成为睡眠的候选人,永远不会回落。为了处理这些情况,引擎会监控装配加速产品和当前时间步大小是否超过 线速度 和/或 角速度 阈值。
阈值参考
下表提供用于确定组件是否移动或加速的各种位移和速度阈值。
阈值 | 值 | 状态变更 |
---|---|---|
邻居挤占 | 0.01 格 | 睡眠检查 > 醒来 |
邻近线速度 | 0.2 格/秒 | 睡眠检查 > 醒来 |
邻近角度速度 | 0.2 射角/秒 | 睡眠检查 > 醒来 |
抵消 | 0.001 格 | 睡眠 > 醒来 |
线速度 | 0.1 格/秒 | 睡眠 > 醒来 |
扭矩角度 | 0.1 射角/秒 | 睡眠 > 醒来 |
额外的唤醒情况
除了在 睡眠检查 和 睡眠 中描述的情况外,一个装配在以下情况下进入 醒来 状态:
它与另一个装配冲突。
任何物理相关属性的任何 BasePart 在装配中发生变化,包括:
非零脉冲被应用到组装中的任何 BasePart 内,通过 ApplyImpulse() , ApplyImpulseAtPosition() 或 ApplyAngularImpulse() 。
任何物理相关的属性变化在 Workspace 上,可能会影响装配,包括:
一个新的 被创建,其父级为组件内的 。
任何属性更改为 Constraint 与一个 Attachment 拥有关联的 BasePart 内的组件。
对连接到装配体内的 CurrentAngle 的 Motor 属性进行了更改,该属性与装配体内的 BasePart 相连。
装配包含一个 VehicleSeat 与坐下的玩家角色。
装配在 BlastRadius 的 Explosion 内。
调试视觉化
在游戏测试期间,您可以在 3D 视图右上角的 可视化选项 选项卡中切换 醒来的零件 来显示装配睡眠状态。

启用后,模拟零件将由其当前睡眠状态概述,其中 醒来 部分由红色概述,睡眠检查 部分由橙色概述,而 睡眠 部分未被概述。