每個 組件 在 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。
對連接到組件內的 BasePart 的 Attachment 的 Constraint 進行任何屬性更改。
對連接到組件內的 BasePart 的 Motor 的 CurrentAngle 屬性進行更改。
該組件包含一個有玩家角色坐在上的 VehicleSeat。
該組件位於 BlastRadius 內的 Explosion 中。
調試可視化
在遊戲測試期間,您可以通過在 3D 視口的右上角的 可視化選項 小工具中切換 清醒部件 來可視化組件的睡眠狀態。

啟用後,模擬的部件將根據其當前的睡眠狀態進行輪廓標記, 清醒 的部件用紅色標記, 檢查睡眠 的部件用橙色標記,而 睡眠 的部件則不進行標記。