在Unity中如何阻止数学计算逻辑无限重复执行?
问题根因
导致数值持续累加的核心原因有4个,按出现概率从高到低排序:
- 你的
nomatter是public变量,Unity Inspector面板中设置的数值会覆盖代码里的初始值,如果你不小心在Inspector里把它设为了true,就会每帧都执行healthcalc(),导致StatBase.maxHealth持续累加 - 你使用了
+=累加操作,只要healthcalc被执行多次(比如多次点击鼠标、多组件同时触发),数值就会持续增加,不符合你最终固定为70的预期 - 代码中
rstat.maxHealth拼写不规范,很可能访问到了错误的实例变量,导致加算数值不符合预期 - 多实例冲突:如果你的场景里挂载了多个
rStat组件,所有组件都会响应鼠标点击事件,同时触发加算逻辑
修复方案
- 先检查Inspector面板中
rStat组件的nomatter属性,确认初始值为false,或者直接把nomatter改成private避免Inspector误改 - 删掉没必要的中间变量
nomatter,直接在鼠标点击判断中执行加算逻辑,减少出错概率 - 如果你预期
StatBase.maxHealth最终固定为70,直接用赋值操作替代累加操作,就算逻辑被重复触发也不会出错 - 给逻辑加执行锁,保证加算逻辑只会运行一次
- 规范变量引用,当前实例的属性用
this明确指向,避免访问错误
修复后的代码
// 静态浮点型变量StatBase.maxHealth初始值为0,rStat.maxHealth初始值为70 class rStat : MonoBehaviour { public float maxHealth = 70; // 改为private避免Inspector误修改,用作执行锁 private bool _hasExecuted = false; void Update() { // 只在首次点击鼠标左键且未执行过加算时运行逻辑 if (Input.GetMouseButtonDown(0) && !_hasExecuted) { HealthCalc(); } } // 本地函数移到类级别,逻辑更清晰 void HealthCalc() { // 直接赋值替代累加,保证最终值固定为70 StatBase.maxHealth = this.maxHealth; // 锁死逻辑,后续不会再执行 _hasExecuted = true; } }
内容的提问来源于stack exchange,提问作者joe pace
相关产品推荐
相关产品推荐

