我已经为我想要制作的角色扮演游戏设置了属性系统。我有几个本地脚本和一个服务器脚本,两者都调用模块脚本来检索脚本所需的任何属性的值。我的服务器脚本是增加和减少属性值的脚本。当模块脚本中的函数(特别是更新不同资源栏的 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 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