每個 組件 在 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 的組件發生碰撞。
對組件內的任何 BasePart 應用非零的衝擊力量,通過 ApplyImpulse()、ApplyImpulseAtPosition() 或 ApplyAngularImpulse()。
對 Workspace 內的任何物理相關屬性進行變更,這些變更會影響該組件,包括:
創建一個新的 Constraint,該約束的 Attachment 應附加在組件內的 BasePart 上。
對附加在組件內的 BasePart 的 Attachment 的 Constraint 進行任何屬性變更。
對連接到組件內的 BasePart 的 Motor 的 CurrentAngle 屬性進行變更。
該組件包含一個 VehicleSeat,並且裡面有坐著的玩家角色。
該組件位於一個 Explosion 的 BlastRadius 內。
調試可視化
在遊戲測試期間,您可以通過在 3D 視口右上角的 可視化選項 小部件中切換 清醒部分 來可視化組件的休眠狀態。

啟用後,模擬的部分將根據其當前的休眠狀態進行標記,具體來說,清醒 的部分標記為紅色,檢查休眠 的部分標記為橙色,休眠 的部分則沒有標記。