Unity C#如何提升int更新频率 修复EggNumber数值回退bug
问题根因
你的EggNumber回退是几个逻辑错误共同导致的:
- 核心触发点:
MakeEggVisible协程的while循环入口第一行写了EggNumber = OldEggNumber;,每轮循环都会强制把当前蛋数重置为上一轮存储的旧值。新增小鸡时如果对EggNumber做了增量修改,走到下一轮循环开头就会被直接覆盖,表现为数值回退。 - 变量作用域错误:
Start()方法中统计初始小鸡数时,重新声明了局部变量int ChickenCount,和类的全局公共字段ChickenCount重名,导致Start阶段统计的初始小鸡数量根本没有存入全局变量,初始计数无效。 - 冗余赋值干扰:代码中前后写了3次
EggNumber = OldEggNumber,除了循环开头的重置逻辑会直接导致回退,其余重复赋值没有任何实际作用,只会打乱数值更新的时序。 - 更新时序混乱:小鸡数量统计、产蛋量累加的逻辑被拆分在两次等待间隔中间,新增小鸡后无法立刻同步到计数,必须等完当前等待周期才会刷新计数,进一步放大了数值不同步的问题。
修复步骤
- 删除所有
EggNumber = OldEggNumber的冗余赋值,尤其是循环开头的强制重置语句,从根源避免当前数值被旧值覆盖。 - 修正Start方法里的变量作用域错误,去掉局部变量声明关键字,将初始统计的小鸡数赋值给全局
ChickenCount字段。 - 简化协程逻辑:每轮等待结束后先刷新当前小鸡总数,直接在
EggNumber上累加对应周期的产蛋量(每只鸡每周期产1蛋,直接累加ChickenCount即可,不需要通过OldEggNumber中转),再控制蛋对象的显隐,保证数值更新时序一致。 - 如果需要更高频率的数值更新,可以单独抽离小鸡计数逻辑,按帧或者按短间隔刷新,不需要等2秒产蛋周期到了才更新小鸡总数。
修复后完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class EggLayer : MonoBehaviour { public GameObject Egg; public GameObject Chicken; public Text EggText; public int EggNumber = 0; public float NewEggTime = 2f; public int ChickenCount = 0; void Start() { Egg.SetActive(false); // 修正局部变量重名问题,直接给全局ChickenCount赋值 GameObject[] ChickenToFind = GameObject.FindGameObjectsWithTag("Chicken"); ChickenCount = ChickenToFind.Length; StartCoroutine("MakeEggVisible"); } void Update() { EggText.text = EggNumber.ToString("0"); // 需要更高频率更新小鸡数时,取消下一行注释即可,不需要等协程周期 // ChickenCount = GameObject.FindGameObjectsWithTag("Chicken").Length; } IEnumerator MakeEggVisible() { while (true) { // 等待产蛋周期 yield return new WaitForSeconds(NewEggTime); // 先刷新当前小鸡总数 ChickenCount = GameObject.FindGameObjectsWithTag("Chicken").Length; // 直接累加产蛋量:每只鸡每周期产1个蛋 EggNumber += ChickenCount; // 控制蛋的显隐,和数值计算解耦 Egg.SetActive(true); yield return new WaitForSeconds(NewEggTime); Egg.SetActive(false); } } }
注:后续调整产蛋节奏、蛋的显隐动画时,不要把数值计算逻辑和动画逻辑强绑定,避免新增功能时再次出现数值不同步的bug。
内容的提问来源于stack exchange,提问作者SamTheHen
相关产品推荐
相关产品推荐

