為了支持複雜的物理機制,同時也為玩家提供平滑且具反應性的體驗,Roblox 物理 引擎採用一種 分散式物理 系統,其中計算被分散在伺服器和所有連接的用戶端之間。在這個系統中,引擎將物理模擬的 BaseParts 的 網路擁有權 指派給用戶端或伺服器,以便分擔計算物理的工作。
用戶端與其擁有的部件之間的物理互動體驗 更具反應性,因為沒有來自伺服器的延遲。網路擁有權還能改善伺服器性能,因為物理計算可以在各個用戶端之間分配,讓伺服器能夠優先處理其他任務。
BasePart 擁有權
預設情況下,伺服器保留對任何 BasePart 的擁有權。此外,伺服器 始終 擁有固定的 BaseParts,你不能手動更改它們的擁有權。
根據用戶端的硬體能力和玩家的 Player.Character 與未固定的 BasePart 的距離,引擎會自動將該部件的擁有權指派給用戶端。因此,靠近玩家角色的部件更有可能成為玩家擁有的。
組件擁有權
如果一個基於物理的機制沒有固定的部件,對該機制內的 組件 設定擁有權 將會對該機制中的 每個組件 設定相同的擁有權。
如果你將單個的組件固定,並且它 不是 更大機制的一部分,它的擁有權將歸於伺服器,因為伺服器始終擁有固定的 BaseParts。當重新解除固定同一組件後,其之前的擁有權狀態將會喪失,並回到由引擎自動處理。
如果你在一個更廣泛的組件機制內固定一個組件,則它的擁有權將歸於伺服器,但其他組件的擁有權將保持不變。解除固定同一組件將恢復其之前設定的擁有權。
設定擁有權
在具有複雜物理互動的遊戲中,或在需要直接控制的情況下,可以通過伺服器端調用 BasePart:SetNetworkOwner() 來設定擁有權。
考慮一輛擁有 VehicleSeat 對於駕駛者和 Seat 對於乘客的車輛,兩者均包含在車輛組件中。根據預設的擁有權規則,如果玩家角色坐進 Seat(乘客),然後另一位玩家跳進 VehicleSeat(駕駛者),則 乘客 會獲得整輛車的物理擁有權,因為他們先進入。駕駛者將不得不等待幾個網路循環才能辨識他們的輸入,這樣車輛的反應會比較遲鈍。
以下的 Script 通過手動將網路擁有權分配給駕駛者來解決這個問題。在其中,VehicleSeat 將其 Occupant 設置為坐在上面的 Humanoid,因此腳本會監聽座位的 Changed 事件,以捕捉何時玩家坐進座位中。當駕駛者離開座位時,車輛的網路擁有權會再度恢復自動處理,使用 BasePart:SetNetworkOwnershipAuto()。
local Players = game:GetService("Players")
local vehicleSeat = script.Parent
vehicleSeat.Changed:Connect(function(prop)
if prop == "Occupant" then
local humanoid = vehicleSeat.Occupant
if humanoid then
-- 從角色獲取玩家
local player = Players:GetPlayerFromCharacter(humanoid.Parent)
if player then
vehicleSeat:SetNetworkOwner(player)
end
else
-- 當座位無人佔用時重置擁有權
vehicleSeat:SetNetworkOwnershipAuto()
end
end
end)
可視化擁有權
為了協助調試網路擁有權,Studio 可以在遊戲測試時為物件渲染顏色輪廓。
| 輪廓顏色 | 描述 | |
|---|---|---|
| (綠色) | 你的客戶端擁有該部件並且正在模擬它。 | |
| (紅色) | 該部件在一個“緩衝區”內,你的客戶端正在模擬它,但它仍然由其他東西擁有。你的客戶端可能在此之後獲得擁有權,或者可能會拒絕。 | |
| (白色/灰色) | 伺服器或其他客戶端通過自動網路擁有權或通過 part:SetNetworkOwner() 的明確指派來擁有該部件。 | |
| (黑色) | 該部件既不由伺服器也不由客戶端擁有。物理將不會應用於此部件。 | |
要啟用網路擁有權可視化:
點擊 3D 觀景窗口右上角的 可視化選項 按鈕。

在下拉菜單中,切換開啟 網路擁有者。
安全考量
當客戶端擁有 BasePart 時,Roblox 無法驗證物理計算。客戶端可以利用這一點,向伺服器發送錯誤數據,例如瞬移 BasePart、使其穿過牆壁或在空中飛行。
此外,BasePart.Touched 事件與網路擁有權相關,這意味著客戶端可以在它擁有的 BasePart 上觸發 Touched 事件並將其發送給伺服器,即使伺服器並未看到它碰觸任何東西。例如,一個客戶端可以使一把劍能對地圖另一邊的另一位玩家造成傷害,透過腳本注入觸發事件,因此,檢查客戶端觸發的這類事件的有效性是非常重要的。
有關詳細的安全策略和作弊減輕策略,請參見 安全策略與作弊減輕 的相關內容。