我正在努力让我为 Roblox 构建的奖励系统与我也为同一游戏构建的水平条一起使用
I am struggling with getting the reward system I built for Roblox to work with the levelling bar I also built for the same game
我已经在 Roblox 游戏上工作了大约三个星期,并创造了一些我引以为豪的东西,但我有一个非常严重的错误,我似乎无法解决。我想让这个游戏成为我将来可以添加的东西,所以我制作了一个程序来奖励玩家杀死 NPC 时获得金币和经验值。我还制作了一个 GUI 栏来向玩家展示他们进入下一个级别的进度。我遇到的问题是黄金会出现,但 xp 不会。我一直在用头撞砖墙,因为我已经尝试了 70 多个修复程序,但 xp 仍然不会出现在栏上并且玩家无法升级。
我的xp bar程序是这样的:
--Player related variables--
local player = game.Players.LocalPlayer
local level = player:WaitForChild("Level")
local current = level:WaitForChild("Current")
local max = level:WaitForChild("Max")
--UI related variables--
local gui = script.Parent
local exterior = gui:WaitForChild("Exterior")
local label = exterior:WaitForChild("Label")
local exp = exterior:WaitForChild("Exp")
local bar = exterior:WaitForChild("Bar")
--Change stats upon join--
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
level.Changed:Connect(function(val, level)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
wait(1)
end)
current.Changed:Connect(function(val)
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
wait(1)
end)
我的奖励计划是这样的:
local Humanoid = script.Parent.Humanoid
local Experience = 10
function Dead()
local tag = Humanoid:FindFirstChild("creator")
if tag ~= nil then
if tag.Value ~= nil then
local leaderstats = tag.Value:FindFirstChild("leaderstats")
if leaderstats ~= nil then
leaderstats.Cash.Value = leaderstats.Cash.Value +50
workspace.ServerScriptService.leaderstats.Current:Connect(function(Experience)
if leaderstats.Current.Value ~= nil then
leaderstats.Current.Value = leaderstats.Current.Value + Experience
else leaderstats.Current.Value = 10
end
end)
wait(0.1)
script:Remove()
end
end
end
end
Humanoid.Died:Connect(Dead)
我还有一个 leaderstats 代码,如下所示:
local DataStore = game:GetService("DataStoreService"):GetDataStore("butthole")
game.Players.PlayerAdded:Connect(function(player)
local folder = Instance.new("Folder")
folder.Name = "leaderstats"
folder.Parent = player
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Value = 900
cash.Parent = folder
--start
local level = Instance.new("IntValue", player)
level.Name = "Level"
level.Value = 1
local exp = Instance.new("IntValue", level)
exp.Name = "Current"
exp.Value = 0
local maxExp = Instance.new("IntValue", level)
maxExp.Name = "Max"
maxExp.Value = 100
exp.Changed:Connect(function(val)
if exp.Value >= maxExp.Value then
level.Value = level.Value + 1
exp.Value = 0
maxExp.Value = maxExp.Value * 2.5
end
有些东西没有正确地与其他东西对话,但我不知道那可能在哪里。我不是专业开发者,我只是一个尝试制作游戏的人。
如果您想跳过说明,请滚动到底部
当前代码中的错误:
主要问题是您的奖励计划中的这个片段:
workspace.ServerScriptService.leaderstats.Current:Connect(function(Experience)
if leaderstats.Current.Value ~= nil then
leaderstats.Current.Value = leaderstats.Current.Value + Experience
else leaderstats.Current.Value = 10
end
end)
1: ServerScriptService 不在工作区内
要访问 ServerScriptService,请使用 game.ServerScriptService
2:“leaderstats.Current”不是event...
leaderstats.Current
不是一个事件,所以 event:Connect(func)
将不起作用。 Current.Changed 之类的内容将被视为事件
3:“Current”不在“leaderstats”中
根据您的 leaderstats 代码,Current 不在 leaderstats 内,而是在级别内:player.Level.Current
虽然我指出了这些事情,但我们不会修复 1 和 2,因为 它们是不必要的
4: 额外的参数“level”导致冲突
最后一个错误发生在xp bar脚本:
level.Changed:Connect(function(val, level)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
问题出在代码段的第一行:第二个参数“level”不存在。
Changed
事件只有1 parameter是变化后的新值(在此上下文中,是新级别)。也就是说val
是你等级的数值。
只需从参数中删除“级别”即可修复此部分
解决方案:
奖励脚本:
local Humanoid = script.Parent.Humanoid
local Experience = 10
function Dead()
local tag = Humanoid:FindFirstChild("creator")
if tag ~= nil then
local player = tag.Value -- making variable makes it easier to understand
if player then
local leaderstats = player:FindFirstChild("leaderstats")
local level = player:FindFirstChild("Level") -- "Current" is inside Level
if leaderstats and level then
leaderstats.Cash.Value = leaderstats.Cash.Value +50
level.Current.Value = level.Current.Value +Experience --Simply add the EXP
script:Remove()
end
end
end
end
Humanoid.Died:Connect(Dead)
XP Bar 脚本:
--Player related variables--
local player = game.Players.LocalPlayer
local level = player:WaitForChild("Level")
local current = level:WaitForChild("Current")
local max = level:WaitForChild("Max")
--UI related variables--
local gui = script.Parent
local exterior = gui:WaitForChild("Exterior")
local label = exterior:WaitForChild("Label")
local exp = exterior:WaitForChild("Exp")
local bar = exterior:WaitForChild("Bar")
--Change stats upon join--
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
level.Changed:Connect(function(val)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
current.Changed:Connect(function(val)
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
补充说明
1:处理额外的 XP
当一个人获得足够的 XP 来升级时,XP 设置为 0,等级上升 1。但是,这意味着所有额外的 XP 都没有用。我更改了功能以解决多余的 XP。
leaderstats 脚本(替换您当前的 exp.Changed
函数):
exp.Changed:Connect(function(val)
if exp.Value >= maxExp.Value then
local newLevel = level.Value
local newXP = exp.Value
local newMax = maxExp.Value
while newXP > newMax do
newLevel = newLevel + 1
newXP = newXP - newMax
newMax = newMax * 2.5
end
maxExp.Value = newMax
exp.Value = newXP
level.Value = newLevel
end
end)
2:功能(非必需,但推荐)
创建一个函数来更新UI使得以后的更改更容易
XP Bar 脚本(下半场):
--Change stats upon join--
function updateUI()
label.Text = "Level ".. level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end
updateUI()
level.Changed:Connect(updateUI)
current.Changed:Connect(updateUI)
在听取了 kojocrash 的建议后,该栏现在终于可以使用了:)
我已经在 Roblox 游戏上工作了大约三个星期,并创造了一些我引以为豪的东西,但我有一个非常严重的错误,我似乎无法解决。我想让这个游戏成为我将来可以添加的东西,所以我制作了一个程序来奖励玩家杀死 NPC 时获得金币和经验值。我还制作了一个 GUI 栏来向玩家展示他们进入下一个级别的进度。我遇到的问题是黄金会出现,但 xp 不会。我一直在用头撞砖墙,因为我已经尝试了 70 多个修复程序,但 xp 仍然不会出现在栏上并且玩家无法升级。
我的xp bar程序是这样的:
--Player related variables--
local player = game.Players.LocalPlayer
local level = player:WaitForChild("Level")
local current = level:WaitForChild("Current")
local max = level:WaitForChild("Max")
--UI related variables--
local gui = script.Parent
local exterior = gui:WaitForChild("Exterior")
local label = exterior:WaitForChild("Label")
local exp = exterior:WaitForChild("Exp")
local bar = exterior:WaitForChild("Bar")
--Change stats upon join--
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
level.Changed:Connect(function(val, level)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
wait(1)
end)
current.Changed:Connect(function(val)
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
wait(1)
end)
我的奖励计划是这样的:
local Humanoid = script.Parent.Humanoid
local Experience = 10
function Dead()
local tag = Humanoid:FindFirstChild("creator")
if tag ~= nil then
if tag.Value ~= nil then
local leaderstats = tag.Value:FindFirstChild("leaderstats")
if leaderstats ~= nil then
leaderstats.Cash.Value = leaderstats.Cash.Value +50
workspace.ServerScriptService.leaderstats.Current:Connect(function(Experience)
if leaderstats.Current.Value ~= nil then
leaderstats.Current.Value = leaderstats.Current.Value + Experience
else leaderstats.Current.Value = 10
end
end)
wait(0.1)
script:Remove()
end
end
end
end
Humanoid.Died:Connect(Dead)
我还有一个 leaderstats 代码,如下所示:
local DataStore = game:GetService("DataStoreService"):GetDataStore("butthole")
game.Players.PlayerAdded:Connect(function(player)
local folder = Instance.new("Folder")
folder.Name = "leaderstats"
folder.Parent = player
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Value = 900
cash.Parent = folder
--start
local level = Instance.new("IntValue", player)
level.Name = "Level"
level.Value = 1
local exp = Instance.new("IntValue", level)
exp.Name = "Current"
exp.Value = 0
local maxExp = Instance.new("IntValue", level)
maxExp.Name = "Max"
maxExp.Value = 100
exp.Changed:Connect(function(val)
if exp.Value >= maxExp.Value then
level.Value = level.Value + 1
exp.Value = 0
maxExp.Value = maxExp.Value * 2.5
end
有些东西没有正确地与其他东西对话,但我不知道那可能在哪里。我不是专业开发者,我只是一个尝试制作游戏的人。
如果您想跳过说明,请滚动到底部
当前代码中的错误:
主要问题是您的奖励计划中的这个片段:
workspace.ServerScriptService.leaderstats.Current:Connect(function(Experience)
if leaderstats.Current.Value ~= nil then
leaderstats.Current.Value = leaderstats.Current.Value + Experience
else leaderstats.Current.Value = 10
end
end)
1: ServerScriptService 不在工作区内
要访问 ServerScriptService,请使用 game.ServerScriptService
2:“leaderstats.Current”不是event...
leaderstats.Current
不是一个事件,所以 event:Connect(func)
将不起作用。 Current.Changed 之类的内容将被视为事件
3:“Current”不在“leaderstats”中
根据您的 leaderstats 代码,Current 不在 leaderstats 内,而是在级别内:player.Level.Current
虽然我指出了这些事情,但我们不会修复 1 和 2,因为 它们是不必要的
4: 额外的参数“level”导致冲突
最后一个错误发生在xp bar脚本:
level.Changed:Connect(function(val, level)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
问题出在代码段的第一行:第二个参数“level”不存在。
Changed
事件只有1 parameter是变化后的新值(在此上下文中,是新级别)。也就是说val
是你等级的数值。
只需从参数中删除“级别”即可修复此部分
解决方案:
奖励脚本:
local Humanoid = script.Parent.Humanoid
local Experience = 10
function Dead()
local tag = Humanoid:FindFirstChild("creator")
if tag ~= nil then
local player = tag.Value -- making variable makes it easier to understand
if player then
local leaderstats = player:FindFirstChild("leaderstats")
local level = player:FindFirstChild("Level") -- "Current" is inside Level
if leaderstats and level then
leaderstats.Cash.Value = leaderstats.Cash.Value +50
level.Current.Value = level.Current.Value +Experience --Simply add the EXP
script:Remove()
end
end
end
end
Humanoid.Died:Connect(Dead)
XP Bar 脚本:
--Player related variables--
local player = game.Players.LocalPlayer
local level = player:WaitForChild("Level")
local current = level:WaitForChild("Current")
local max = level:WaitForChild("Max")
--UI related variables--
local gui = script.Parent
local exterior = gui:WaitForChild("Exterior")
local label = exterior:WaitForChild("Label")
local exp = exterior:WaitForChild("Exp")
local bar = exterior:WaitForChild("Bar")
--Change stats upon join--
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
level.Changed:Connect(function(val)
label.Text = "Level "..level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
current.Changed:Connect(function(val)
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end)
补充说明
1:处理额外的 XP
当一个人获得足够的 XP 来升级时,XP 设置为 0,等级上升 1。但是,这意味着所有额外的 XP 都没有用。我更改了功能以解决多余的 XP。
leaderstats 脚本(替换您当前的 exp.Changed
函数):
exp.Changed:Connect(function(val)
if exp.Value >= maxExp.Value then
local newLevel = level.Value
local newXP = exp.Value
local newMax = maxExp.Value
while newXP > newMax do
newLevel = newLevel + 1
newXP = newXP - newMax
newMax = newMax * 2.5
end
maxExp.Value = newMax
exp.Value = newXP
level.Value = newLevel
end
end)
2:功能(非必需,但推荐)
创建一个函数来更新UI使得以后的更改更容易
XP Bar 脚本(下半场):
--Change stats upon join--
function updateUI()
label.Text = "Level ".. level.Value
exp.Text = current.Value.."/"..max.Value.." Exp"
bar.Size = UDim2.new(current.Value/max.Value, 0, 1, 0)
end
updateUI()
level.Changed:Connect(updateUI)
current.Changed:Connect(updateUI)
在听取了 kojocrash 的建议后,该栏现在终于可以使用了:)