我正在努力让我为 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 的建议后,该栏现在终于可以使用了:)