我正在努力让我为 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 构建的奖励系统与我也为同一游戏构建的调平条一起工作的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 SQL DB 与我的领域驱动设计相匹配

Lua 刷新脚本 (ROBLOX)

Roblox leaderstat 只更新一次

与我自己的静态库链接的问题

如何制作基础系统? -- Roblox Lua

如何更改与我的(Xcode 管理的)团队供应配置文件关联的 App ID