网络所有权

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

为了支持复杂的物理机制,同时也旨在为玩家提供流畅和响应迅速的体验,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() 明确分配拥有该部件。
(黑色)该部件既不属于服务器也不属于客户端。物理将不适用于该部件。

要启用网络所有权可视化:

  1. 单击 3D 视口右上角的 可视化选项 按钮。

    3D 视口的特写视图,右上角指示可视化选项按钮。
  2. 在下拉菜单中,切换开启 网络所有者

安全问题

当客户端拥有 BasePart 时,Roblox 无法验证物理计算。客户端可以利用这一点并向服务器发送错误数据,如传送 BasePart、使其穿墙或飞翔。

此外,BasePart.Touched 事件与网络所有权相关,这意味着客户端可以在其拥有的 BasePart 上触发 Touched 事件并将其发送给服务器,即使服务器没有看到它碰触任何东西。例如,客户端可以通过脚本注入使剑对地图另一侧的另一位玩家造成伤害,因此验证客户端触发的此类事件的有效性变得非常重要。

请参见 安全策略和作弊缓解 以获取详细的安全策略和Roblox游戏的作弊缓解策略。

©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。