Unity中数组变动时int类型计数变量清零问题如何修复
问题原因
你的计数重置问题来自两个代码逻辑错误:
EggNumber是挂载在每个EggLayer实例上的非静态成员变量,所有新生成的小鸡对象自带的EggLayer组件都会把这个值初始化为0,每个对象各自计数,没有做全局统一统计。- 小鸡数量
ChickenCount只在协程启动时查询了一次,协程运行过程中新生成的小鸡不会被计入产蛋数量的乘数,新鸡不会贡献产蛋量。
修复方案
按以下步骤修改代码即可解决问题:
- 将总鸡蛋计数
EggNumber改为静态变量,保证场景内所有EggLayer实例共享同一个计数,不会因为新对象生成重置数值 - 把小鸡数量的查询逻辑移到协程的循环内部,每次产蛋前重新统计当前场景内的小鸡总数,保证新增小鸡能被正确计入产蛋效率
- 移除Update里每帧刷新UI的逻辑,改为鸡蛋数变化时同步刷新UI,减少不必要的性能消耗
修复后的完整代码如下:
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; // 静态变量全局共享,不会随新对象生成重置为0 public static int EggNumber = 0; public float NewEggTime = 2f; void Start() { Egg.SetActive(false); StartCoroutine(nameof(MakeEggVisible)); } IEnumerator MakeEggVisible() { while (true) { yield return new WaitForSeconds(NewEggTime); // 每次产蛋前重新统计当前所有带Chicken标签的对象,覆盖新生成的小鸡 GameObject[] ChickenToFind = GameObject.FindGameObjectsWithTag("Chicken"); int ChickenCount = ChickenToFind.Length; EggNumber += ChickenCount; // 数值更新后同步刷新UI显示 EggText.text = EggNumber.ToString("0"); Egg.SetActive(true); yield return new WaitForSeconds(NewEggTime); Egg.SetActive(false); } } }
补充说明
- 请确认所有小鸡预制体都已经打上
Chicken标签,否则数量统计会出现偏差 - 静态变量不会在退出运行模式时自动重置,如果后续需要添加重开游戏的功能,记得在游戏初始化逻辑里手动给
EggNumber赋值为0完成重置 - 后续如果游戏数据逻辑变复杂,可以单独创建一个挂载在场景常驻对象上的全局管理脚本统一存储所有游戏数据,比零散使用静态变量更易维护,当前方案足够解决你遇到的计数重置问题
内容的提问来源于stack exchange,提问作者SamTheHen
相关产品推荐
相关产品推荐

