当变量的值发生变化时,如何更新变量?

问题描述 投票:0回答:1

我已经为我想要制作的角色扮演游戏设置了属性系统。我有几个本地脚本和一个服务器脚本,两者都调用模块脚本来检索脚本所需的任何属性的值。我的服务器脚本是增加和减少属性值的脚本。当模块脚本中的函数(特别是更新不同资源栏的 GUI 的函数)尝试在资源栏的最大资源之一(例如最大耐力)降低时进行更新时,我遇到了问题。然而,当最大耐力之类的东西增加时,代码似乎没有任何问题。

这是模块脚本,我非常确定问题出在 updateStaminaBar 和 updateManaBar 函数中:

local StatManager = {}

-- Stat Variables
StatManager.Endurance = StatManager.player.Stats.Endurance.Value

-- Stamina Settings
StatManager.staminaText = StatManager.playerGui.resourceGui.staminaBackground:WaitForChild("staminaText")

StatManager.stamina = math.round(100 + StatManager.Endurance + (StatManager.Agility / 2))
StatManager.maxStamina = StatManager.player.Stats.maxStamina.Value

function StatManager.statsUpdate()
    
    StatManager.updateStamina()
    StatManager.updateStaminaBar()
    
end

function StatManager.updateStaminaBar()
    
    local stamina = StatManager.stamina
    local maxStamina = StatManager.getUpdatedStat("maxStamina")
    StatManager.playerGui.resourceGui.staminaBackground.staminaBar:TweenSize(UDim2.new(stamina / maxStamina, 0, 1, 0), Enum.EasingDirection.InOut, Enum.EasingStyle.Sine, 0.15, true)
    StatManager.staminaText.Text = math.round(stamina).. "/" .. math.round(maxStamina)
    
end


function StatManager.getUpdatedStat(statName)
    
    local playerStats = game.Players.LocalPlayer.Stats
    
    local Endurance = StatManager.player.Stats.Endurance.Value
    local maxStamina = StatManager.player.Stats.maxStamina.Value
        
    if statName == "Endurance" then return Endurance
        
    elseif statName == "maxStamina" then return maxStamina
        
    end
end

return StatManager

我创建了 getUpdatedStat(statName) 函数来看看这是否可以解决我的问题,据您所见,我只在 updateStaminaBar 函数中实现了它的用法。这中间的工作原理是,当统计数据重置并且最大耐力降低时,耐力条会读取正确的最大耐力,但实际耐力值不会改变并保持在最大值之上,并且会恢复到最大值。我认为这意味着实际的最大耐力值并没有改变,但我不知道如何解决这个问题。

这是服务器脚本中更新每个属性值的函数:

statsEvent.OnServerEvent:Connect(function(plr, eventtype, Arg1)
    
    local Character = plr.Character
    
    if eventtype == "addStat" and plr.Stats.availablePoints.Value > 0 then
        
        local statType = Arg1
                
            if statType == "addEnduranceButton" then
                plr.Stats.availablePoints.Value -= 1
                plr.Stats.Endurance.Value += 1
                statsEvent:FireClient(plr, "enduranceUpdate")
                
        end
    end
end)

这是本地脚本函数,它与提升属性所具有的不同效果相混淆:

statsEvent.OnClientEvent:Connect(function(eventtype)
    
        
    if eventtype == "enduranceUpdate" then
        statManager.maxStamina += 1
        statManager.statsUpdate()

    end
end)

最后,这是我用于测试目的的函数,它将所有玩家的属性重置为默认值。尽管如上所述,我使用函数来测试更新统计值,但由于某种原因,这似乎并没有实际更新统计值。 (在服务器脚本内):

statsEvent.OnServerEvent:Connect(function(plr, eventtype)
    
    local character = plr.Character
    
    if eventtype == "resetAll" then
        
        plr.Stats.Endurance.Value = 0
        plr.Stats.maxStamina.Value = 100
        wait(1)
        expEvent:FireClient(plr, "updateExp")
        statsEvent:FireClient(plr, "updateStats")
    end
end)

我相信这就是所有相关代码。总结一下我遇到的问题,当我重置所有统计数据时,耐力和法力条不会随着更改而正确更新,但当统计数据增加时它们会更新。

可能也很重要的是,我设置了一个数据存储系统,可以在连接时保存和加载玩家的统计数据并更新所有 GUI。重置/降低玩家的统计数据后,GUI 不会更新,但重新连接时,GUI 会显示重置/降低统计值后应出现的正确值。所以,我认为这应该意味着价值观实际上正在改变?我好失落

我查看了其他几个人的统计系统,但他们都没有将最大值与统计数据相关联。我确实尝试创建一个函数来再次获取统计值,因为我认为当值发生变化时,顶部的模块脚本统计变量可能不会更新。这取得了一些成功,但只是带来了如上所述的另一个问题。

function variables lua variable-assignment roblox
1个回答
0
投票
function StatManager.statsUpdate()
--StatManager.updateStamina()
StatManager.Endurance=StatManager.player.Stats.Endurance.Value
--StatManager.Agility=StatManager.player.Stats.Agility.Value
StatManager.stamina=math.round(100+StatManager.Endurance+(StatManager.Agility/2))

StatManager.updateStaminaBar()
end
© www.soinside.com 2019 - 2024. All rights reserved.