Unity贪吃蛇开发:碰撞触发后如何实现每次仅生成1个苹果
贪吃蛇苹果重复生成问题修复
问题根因
出现一次性生成大量苹果的异常,是两个逻辑漏洞叠加导致的:
- 苹果存在性判断逻辑完全失效:Unity里通过
Instantiate生成的对象,默认名字会在原预制体名后加(Clone)后缀,比如原预制体叫Apple,生成的实例名是Apple(Clone),和代码里GameObject.Find("Apple")的匹配字符串完全不一致,永远找不到新生成的苹果 - 生成逻辑被高频重复触发:
checkApple()方法放在Update里每帧无条件执行,因为上面的存在性判断一直返回空,从第一个原始苹果被销毁的帧开始,每帧都会走到生成苹果的分支,极短时间内就会刷出上百个苹果 - 苹果脚本里的
OnTriggerEnter2D销毁自身的逻辑本身没有问题,只是和上面的漏洞叠加才触发了异常
最小改动修复方案
不需要重构现有代码,补一行就能跑通正确逻辑:
在新苹果实例生成完成后,强制把它的名字改成和判断逻辑匹配的无后缀字符串,让后续的GameObject.Find能正常识别到已存在的苹果。改完的核心代码段如下:
// 苹果对象上的触发逻辑 void OnTriggerEnter2D(Collider2D other) { Destroy(gameObject); } // 挂载在管理脚本上的苹果生成逻辑,把Apple预制体拖入对应公开字段 public GameObject Apple; public void checkApple() { if (GameObject.Find("Apple")) { Debug.Log("The apple has not been eaten"); } else { Debug.Log("The apple has been eaten!"); GameObject a = Instantiate(Apple) as GameObject; a.transform.position = new Vector2(-10.26f, 3.66f); // 新增:去掉默认的(Clone)后缀,匹配Find的搜索字符串 a.name = "Apple"; } } void Update() { checkApple(); }
这样修改后,新苹果生成的那一帧结束,下一帧Update跑检查时就能正常匹配到苹果对象,进入"未被吃掉"的分支停止生成,完全符合你想要的"吃一个、生一个、循环往复"的效果。目前你使用固定坐标生成的逻辑可以先保留,后续要调整成随机位置时,只需要替换坐标赋值的语句即可,不影响整体逻辑。
后续优化方向
等基础逻辑跑通后,可以替换掉当前的轮询判断逻辑,降低不必要的性能消耗:
- 弃用
GameObject.Find方法,在管理脚本中定义成员变量存储当前苹果的实例引用,判断时直接检查引用是否为空即可,效率比全场景字符串搜索高很多 - 去掉Update里的每帧轮询,改成苹果被碰撞吃掉时主动通知管理脚本生成新苹果,从触发机制上彻底避免重复执行生成代码的可能
内容的提问来源于stack exchange,提问作者Ayman Almuti
相关产品推荐
相关产品推荐

