如何制作销售脚本? (罗布乐思)
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)
我一直在制作一个 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)