目前我正在制作一款游戏,你可以在其中找到" L"在键盘上,它会更改为您可以控制的部分... 但奇怪的是,当它接近一个玩家(而不是产生它的玩家......)时,它会冻结。但是在其他玩家的屏幕上,它仍然可以移动。
我在玩家的背包中使用了一个本地脚本进行凸轮更换...... 当我切换到(cam.CameraSubject = part.Humanoid)时,它会执行我描述的故障/错误,包括模型中的所有其他部分。但如果我有 (cam.CameraSubject = part(模型)),它有效,但它有点滞后...... 我可以采取任何其他方式来做这个??? 我使用的那部分是否可能太小了?
答案 0 :(得分:0)
我相信这是由于ROBLOX如何模拟物理学。当物理模拟零件时,模拟零件的实际工作将委托给最近的客户。该距离基于玩家角色在游戏世界中的位置。如果没有玩家关闭,服务器本身就会负责模拟部件。
因此,如果你有一个玩家正在控制的部分,那么该部分可能实际上是由另一个玩家的计算机物理控制的,如果它更近的话。这可能就是为什么当它接近另一个玩家时你的部分似乎会冻结。
解决方案: SetNetworkOwner
前段时间,ROBLOX添加了一些有用的方法,允许游戏开发者覆盖我上面描述的默认物理代理。通过使用BasePart:SetNetworkOwner(player)
,您可以指定客户应负责处理对象的物理。
所以你需要做的就是获得一个服务器端脚本来调用你提到的控制部分上的SetNetworkOwner
:
controlPart:SetNetworkOwner(player)
这是一个小例子。当玩家进入时,会创建一个部件并将其分配给玩家。请注意SetNetworkOwner
的使用方式。当玩家离开时,该部分被摧毁:
local controlPart = Instance.new("Part")
local controlParts = {}
function PlayerAdded(player)
local part = controlPart:Clone()
part.Parent = game.Workspace
controlParts[player] = part
-- Set the network owner to the player:
part:SetNetworkOwner(player)
end
function PlayerRemoving(player)
local part = controlParts[player]
if (part) then
part:Destroy()
end
controlParts[player] = nil
end
game.Players.PlayerAdded:connect(PlayerAdded)
game.Players.PlayerRemoving:connect(PlayerRemoving)
注意:
有关此主题的更多信息,请参阅Network Ownership上的官方ROBLOX Wiki页面。