Roblox Studio Bug:远程事件参数为零

问题描述 投票:0回答:1

我的 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 参数为零。但我该如何解决这个问题?

roblox luau
1个回答
0
投票

您遇到了客户端-服务器复制的问题。请记住,服务器是对象的权威。当一个对象在服务器上创建时,它的创建会被复制到所有客户端,并且所有玩家都可以看到该对象。 但是,出于安全原因,当在客户端上创建对象时,其创建不会复制到服务器。

这意味着,如果您在客户端上创建一个对象,然后向服务器询问该对象,服务器将不知道您在说什么,因为该对象在服务器上不存在。

那么让我们看看你的代码...

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
连接的内容向下移动到客户端,并在客户端上播放动画。但是,其他玩家将无法看到这些动画播放,因为它们只能在该特定客户端上播放。

© www.soinside.com 2019 - 2024. All rights reserved.