制作游戏Stamina Bar时按LeftShift触发Attempt to call Udim2 value错误求助
问题:制作Stamina Bar时按下LeftShift触发“Attempt to call Udim2 value”错误
错误原因
参数格式错误(核心问题):调用
TweenSize时,UDim2.new()的结果和后续参数之间缺少逗号,Lua会将UDim2对象误认为可调用函数,从而抛出“Attempt to call Udim2 value”错误。比如原代码中:script.Parent:TweenSize(UDim2.new(Stamina/ 100, 0, 1, 0) "Out", "Linear", 0)这里
UDim2.new(...)后面直接跟"Out",Lua会解析为UDim2.new(...)( "Out" ),也就是试图调用UDim2对象,这是非法操作。拼写错误:
charcter→character(玩家角色变量名拼写错误)Humainoid→Humanoid(人形对象拼写错误,会导致无法访问WalkSpeed)
逻辑漏洞:
- 用
Stamina == 0判断 stamina 耗尽不严谨,浮点运算下数值可能永远不会精确等于0,应该用Stamina <= 0 - 恢复 stamina 的循环里错误保留了
if Stamina == 0的判断,完全不符合逻辑,需要移除
- 用
修正后的代码
local player = game.Players.LocalPlayer local character = player.Character -- 修正拼写 local UserInputService = game:GetService("UserInputService") local Stamina = 100 local running = false Stamina = math.clamp(Stamina, 0, 100) UserInputService.InputBegan:Connect(function(input) if input.KeyCode == Enum.KeyCode.LeftShift then running = true character.Humanoid.WalkSpeed = 22 -- 修正拼写 while Stamina > 0 and running do Stamina = Stamina - 0.6 Stamina = math.clamp(Stamina, 0, 100) -- 每次修改后都 clamp 防止溢出 -- 修正TweenSize的参数格式,添加逗号分隔 script.Parent:TweenSize(UDim2.new(Stamina / 100, 0, 1, 0), "Out", "Linear", 0, true) task.wait() -- 用task.wait()替代wait(),更高效 if Stamina <= 0 then -- 改用<=判断耗尽 character.Humanoid.WalkSpeed = 16 end end end end) UserInputService.InputEnded:Connect(function(input) if input.KeyCode == Enum.KeyCode.LeftShift then running = false character.Humanoid.WalkSpeed = 16 -- 修正拼写 while Stamina < 100 and not running do Stamina = Stamina + 0.5 Stamina = math.clamp(Stamina, 0, 100) -- 每次修改后clamp -- 同样修正TweenSize参数格式 script.Parent:TweenSize(UDim2.new(Stamina / 100, 0, 1, 0), "Out", "Linear", 0, true) task.wait() end end end)
额外优化说明
- 每次修改Stamina后都调用
math.clamp,确保数值始终在0-100范围内,避免溢出 - 用
task.wait()替代旧的wait(),性能更优 - TweenSize添加最后一个参数
true(可选),允许打断之前的动画,让 stamina 条的变化更流畅
内容的提问来源于stack exchange,提问作者ItsInkYT
相关产品推荐
相关产品推荐

