如何制作销售脚本? (罗布乐思)

How do I make a sell script? (Roblox)

我一直在制作一个 Roblox 模拟器作为副项目来学习如何制作游戏,现在我得到了一些帮助,如下所示,但它仍然无法正常工作。我在这些链接中有一些图片和视频: https://flickr.com/photos/195497771@N05 https://vimeo.com/user173767075

目前我的问题仍然是我的问题标题和我的工具不工作。我将其更改为远程事件,现在它停止更改我的 leaderstats。我尝试了很多不同的解决方案,但 none 有效。我的第一个脚本是我的工具脚本。这是:

local player = game.Players.LocalPlayer

script.Parent.Activated:Connect(function()
    if player.Debounce.Value == false then
        game.ReplicatedStorage.Power:FireServer(script.Parent.Values)
    
local action = script.Parent.Parent.Humanoid:LoadAnimation(script.Parent.Animation)
        
        action:Play()
    end
end)

现在,它在 LocalScript 中并且有效。它打印它已激活并播放动画。现在我的问题是 ServerScriptService 中的脚本没有接收到远程事件。我有一个印刷品,但没有任何反应。这是该脚本:

game.ReplicatedStorage.Power.OnServerEvent:Connct(function(player, valueFolder)
    if player.Debounce.Value == false then
        player.leaderstats.Sticks.Value += valueFolder.Power.Value
        player.Debounce.Value = true
        wait(valueFolder.Cooldown.Value)
        player.Debounce.Value = false
    end
end)

因此,对于我最初的问题,卖家知道我触摸了它并激活了事件,但领导者统计数据没有任何变化。这是我的脚本,用于检测玩家何时触摸卖出部分。

local sellevent = game.ReplicatedStorage.Sell

script.Parent.Touched:Connect(function(hit)
    if hit.Parent:FindFirstChild("Humanoid") then
        print("sell fired")
        sellevent:Fire()
    end
end)

该脚本有效。但那是一个服务器脚本。让我知道是否应该将其更改为 LocalScript。现在,这里是我的脚本,用于更改 leaderstats,它检测到触发的事件,但 leaderstats 没有任何变化。

game.ReplicatedStorage.Sell.Event:Connect(function(player)
    print("bindable event fired")
    if player ~= nil then
        if player.leaderstats.Sticks.Value > 0 then
            player.leaderstats.Cash.Value += player.leaderstats.Sticks.Value
            player.leaderstats.Sticks.Value = 0
        end
    end
end)

我提供了尽可能多的信息。如果您需要其他任何东西,我可以获取更多图片或视频,但这是我能提供的最好的。任何帮助表示赞赏!

好吧,看完视频,我可能有预感是哪里出了问题。 您原始问题中的代码工作得很好。如果在将 Sticks.Value 添加到 Cash.Value 之前打印出 Sticks.Value,您会看到 Sticks.Value 保持为 0。并且您总是将 0 添加到 Cash。

这可能是因为您正在使用工具来递增 Sticks.Value,并且工具通常使用 LocalScripts 来连接逻辑。当您在 LocalScripts 中更改世界(或 leaderstats 值)时,这些更改仅出现在 that 客户端上。它们不会复制到服务器。由于您所有的现金逻辑都在服务器脚本中,因此 Sticks 值在服务器上保持为 0。

因此,要解决此问题,您需要确保递增 Sticks.Value 的代码发生在脚本中。您可以像使用 BindableEvent 一样使用 RemoteEvents 从工具到服务器脚本进行通信。

因此,在您的工具的 LocalScript 中,您将执行如下操作:

-- find the RemoteEvent saved in ReplicatedStorage
local stickEvent = game.ReplicatedStorage.GetSticksEvent

-- listen for when the Tool is used
script.Parent.Activated:Connect(function()
    -- tell the server to give us some sticks...
    stickEvent:FireServer()
end)

然后,在服务器脚本中,监听 RemoteEvent 触发以给玩家一些棍子:

-- find the RemoteEvent saved in ReplicatedStorage
local stickEvent = game.ReplicatedStorage.GetSticksEvent

-- listen for when the client tells us that they got some sticks
stickEvent.OnServerEvent:Connect(function(player)
    -- give the player some sticks
    player.leaderstats.Sticks.Value += 1
end)

编辑 - 在这个最新版本中,您的销售脚本已停止工作,因为玩家参数为零。在此代码的早期版本中,播放器中传递了 Touched 脚本,但您删除了该代码并破坏了 Sell 脚本。所以只需将脚本回滚到其早期状态:

script.Parent.Touched:Connect(function(hit)
    if hit.Parent:FindFirstChild("Humanoid") then
        local player = game.Players:GetPlayerFromCharacter(hit.Parent)
    
        game.ReplicatedStorage.BindableEvents.Sell:Fire(player)
    end
end)