我的 Roblox 项目有一个错误。我非常沮丧,因为它没有按预期工作。我有一个从本地脚本触发服务器的远程事件。它给出了参数“OilBarrel”。在服务器脚本中,它会查看何时发射,然后玩家拿起油桶。在那里我有播放器和 OilBarrel 参数。当我尝试在服务器脚本中打印 OilBarrel 时,它显示“nil”,但在本地脚本中则不然。这是本地脚本的代码:
local WS = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local RemoteEvents = ReplicatedStorage:WaitForChild("RemoteEvents")
local TakeOilBarrelEvent = RemoteEvents.TakeOilBarrel
local ThrowOilBarrelEvent = RemoteEvents.ThrowOilBarrel
local SpawnOilBarrelEvent = RemoteEvents.SpawnOilBarrel
local plr = Players.LocalPlayer
local char = plr.Character
local torso = char:WaitForChild("LowerTorso")
local mouse = plr:GetMouse()
local OilBarrelGui = script.Parent.Parent.OilBarrelGui
local DropOilBarrel = OilBarrelGui.DropOilBarrel
local debounce = false
local function getTycoon(player)
for _, tycoon in game.Workspace.Tycoons:GetChildren() do
if tycoon:GetAttribute("UserId") == player.UserId then
return tycoon
end
end
end
local function ThrowOilBarrel(OilBarrel)
ThrowOilBarrelEvent:FireServer(OilBarrel)
OilBarrelGui.Enabled = false
debounce = false
end
local function TakeOilBarrel(OilBarrel)
TakeOilBarrelEvent:FireServer(OilBarrel)
OilBarrelGui.Enabled = true
end
SpawnOilBarrelEvent.OnClientEvent:Connect(function()
local Tycoon = getTycoon(plr)
local OilBarrelStation = Tycoon.Decoration.OilBarrelStation.Platform
local OilBarrel = ReplicatedStorage:WaitForChild("OilBarrel")
local OilBarrelClone = OilBarrel:Clone()
OilBarrelClone.Parent = WS:WaitForChild("OilBarrels")
OilBarrelClone.Position = OilBarrelStation.Position + Vector3.new(0, 2, 0)
local OilBarrels = WS:WaitForChild("OilBarrels"):GetChildren()
for _, OilBarrel in ipairs(OilBarrels) do
if OilBarrel.Name == "OilBarrel" then
OilBarrel.ClickDetector.MouseClick:Connect(function(player)
if OilBarrel:FindFirstChild("Weld") then return end
if player == plr then
if debounce then return end
debounce = true
TakeOilBarrel(OilBarrel)
DropOilBarrel.MouseButton1Click:Connect(function()
ThrowOilBarrel(OilBarrel)
end)
mouse.KeyDown:Connect(function(key)
if key == "q" then
ThrowOilBarrel(OilBarrel)
end
end)
end
end)
else
continue
end
end
end)
这里是服务器脚本:
TakeOilBarrelEvent.OnServerEvent:Connect(function(player, OilBarrel)
local char = workspace:WaitForChild(player.Name)
local Animate = char:FindFirstChild("Animate")
if Animate then
Animate:Destroy()
end
local OilBarrelAnimation = game:GetService("ReplicatedStorage"):WaitForChild("Animations").OilBarrelAnimation
if char:FindFirstChild("OilBarrelAnimation") == nil then
local OilBarrelAnimationClone = OilBarrelAnimation:Clone()
OilBarrelAnimationClone.Parent = char
end
local torso = char:WaitForChild("LowerTorso")
local weld = Instance.new("Weld")
weld.Parent = OilBarrel
weld.Part0 = OilBarrel
weld.Part1 = torso
OilBarrel.CFrame = torso.CFrame
OilBarrel.Rotation = Vector3.new(0, -180, -90)
OilBarrel.Position = OilBarrel.Position + torso.CFrame.LookVector * 2.2
end)
当我想拿起油桶时,我收到此错误: “尝试使用 CFrame 索引“nil”” 这意味着 OilBarrel 参数为零。但我该如何解决这个问题?
您遇到了客户端-服务器复制的问题。请记住,服务器是对象的权威。当一个对象在服务器上创建时,它的创建会被复制到所有客户端,并且所有玩家都可以看到该对象。 但是,出于安全原因,当在客户端上创建对象时,其创建不会复制到服务器。
这意味着,如果您在客户端上创建一个对象,然后向服务器询问该对象,服务器将不知道您在说什么,因为该对象在服务器上不存在。
那么让我们看看你的代码...
SpawnOilBarrelEvent.OnClientEvent:Connect(function()
local Tycoon = getTycoon(plr)
local OilBarrelStation = Tycoon.Decoration.OilBarrelStation.Platform
local OilBarrel = ReplicatedStorage:WaitForChild("OilBarrel")
local OilBarrelClone = OilBarrel:Clone()
OilBarrelClone.Parent = WS:WaitForChild("OilBarrels")
OilBarrelClone.Position = OilBarrelStation.Position + Vector3.new(0, 2, 0)
这里,服务器告诉客户端生成桶,客户端创建桶。这意味着该桶仅存在于该客户端上。所以你不能让服务器逻辑与那个桶交互。
解决方法是...
a) 将
SpawnOilBarrelEvent.OnClientEvent
连接的内容移动到服务器,以便所有玩家都存在桶。这可能会对游戏性能以及谁可以与木桶互动产生影响,您也需要解决这个问题。
或者...
b) 将
TakeOilBarrelEvent.OnServerEvent
连接的内容向下移动到客户端,并在客户端上播放动画。但是,其他玩家将无法看到这些动画播放,因为它们只能在该特定客户端上播放。