我正在努力让我为 Roblox 构建的奖励系统与我也为同一游戏构建的调平条一起工作
Posted
技术标签:
【中文标题】我正在努力让我为 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 【发布时间】:2022-01-12 05:04:02 【问题描述】:我已经在 Roblox 游戏上工作了大约三周,并创造了一些我引以为豪的东西,但我有一个非常严重的错误,我似乎无法解决。我想让游戏成为我未来可以添加的东西,所以我做了一个程序来奖励玩家击杀 NPC 的金币和经验值。我还制作了一个 GUI 栏来向玩家展示他们进入下一个级别的进度。我的问题是金币会出现,但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
有些东西不能正确地与其他东西对话,但我不知道那可能在哪里。我不是专业开发者,我只是一个尝试制作游戏的人。
【问题讨论】:
【参考方案1】:如果您想跳过解释,请滚动到底部
当前代码中的错误:
主要问题是您的奖励计划中的这个sn-p:
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:“当前”不在“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)
问题出在sn-p的第一行:第二个参数“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 栏脚本:
--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 栏脚本(第二半):
--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)
【讨论】:
非常感谢您的帮助。我自己根本就不会想到这一点。【参考方案2】:在听取了 kojocrash 的建议后,酒吧现在终于可以正常工作了 :)
【讨论】:
嘿嘿,你应该把他们的答案标记为正确 我不知道该怎么做。 他的答案旁边应该有一个复选标记的轮廓。点击那个。 ***.com/help/someone-answers 好的,是的,它变成了绿色。以上是关于我正在努力让我为 Roblox 构建的奖励系统与我也为同一游戏构建的调平条一起工作的主要内容,如果未能解决你的问题,请参考以下文章