为了支持复杂的物理机制,同时也旨在为玩家提供流畅和响应迅速的体验,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 事件并将其发送给服务器,即使服务器没有看到它碰触任何东西。例如,客户端可以通过脚本注入使剑对地图另一侧的另一位玩家造成伤害,因此验证客户端触发的此类事件的有效性变得非常重要。
请参见 安全策略和作弊缓解 以获取详细的安全策略和Roblox游戏的作弊缓解策略。