Unity如何避免Update中浮点数重复累加过大且保留生命值实时更新
问题根源
你代码中的重复累加问题和Update本身无关,核心是运算符使用错误:你用了链式+=运算而非普通求和运算,每次执行代码时都会先修改各个身体部位的原始生命值,再把修改后的值赋值给currentHealth,因此每执行一次数值就会累加一次。
原代码的实际执行逻辑等价于:
// 先把body的血量加到头部血量上 head.currentHeadHealth += body.currentBodyHealth; // 再把左臂血量加到已经被修改过的头部血量上 head.currentHeadHealth += lArm.currentLeftArmHealth; // 以此类推所有部位,最终头部血量会变成所有部位血量的和,再赋值给currentHealth currentHealth = head.currentHeadHealth;
相当于你每帧都在给各个部位叠加血量,自然数值会持续异常上涨。
修复方案
方案1:直接修正求和逻辑(保留Update执行,满足你的需求)
只需要把链式+=全部换成普通+即可,每次执行只会计算所有部位当前血量的和,不会修改各个部位的原始数值:
currentHealth = head.currentHeadHealth + body.currentBodyHealth + lArm.currentLeftArmHealth + rArm.currentRightArmHealth + lHand.currentLeftHandHealth + rHand.currentRightHandHealth + lLeg.currentLeftLegHealth + rLeg.currentRightLegHealth + lFoot.currentLeftFootHealth + rFoot.currentRightFootHealth;
这个方案不需要修改你现有的肢体脚本结构,直接替换Update里的代码就能正常运行,总生命值会每帧同步最新的各部位血量和。
方案2:可选优化(降低性能开销)
如果不想每帧执行求和逻辑,可以用事件回调机制,在每个肢体的受伤函数执行完成后,通知玩家父对象更新总血量:
- 在玩家父对象脚本中新增一个更新总血量的方法:
public void UpdateTotalHealth() { currentHealth = head.currentHeadHealth + body.currentBodyHealth + lArm.currentLeftArmHealth + rArm.currentRightArmHealth + lHand.currentLeftHandHealth + rHand.currentRightHandHealth + lLeg.currentLeftLegHealth + rLeg.currentRightLegHealth + lFoot.currentLeftFootHealth + rFoot.currentRightFootHealth; // 这里可以同步更新血条UI healthBar.SetHealth(currentHealth); hpAmount.text = currentHealth.ToString("0"); }
- 在每个肢体脚本的受伤函数(扣血逻辑执行完成的位置),调用父对象的更新方法:
// 扣血逻辑执行完成后 GetComponentInParent<你的玩家脚本类名>().UpdateTotalHealth();
这个方案只有在受伤时才会执行求和,不需要每帧运行,性能更优,也不会影响你各个肢体的独立逻辑。
内容的提问来源于stack exchange,提问作者CyberScope _
相关产品推荐
相关产品推荐

