Unity3D程序化生成地砖逐次销毁异常:如何实现每秒销毁一个直至全部清除?
解决Unity程序化生成方块逐个销毁的问题
咱们先拆解下你的代码里存在的几个核心问题:
- Update重复启动协程:你在
Start()里已经启动了销毁协程,但Update()每帧都再调用一次,这会瞬间生成上百个并行协程,一开始可能批量销毁方块,后续逻辑直接混乱。 - 协程仅执行单次销毁:原
SelfDestruct协程只完成一次销毁就结束了,没有循环逻辑持续执行销毁动作。 - 未维护方块列表:销毁方块后没有从
blockList里移除对应元素,导致后续随机取索引时,可能选中已销毁的无效对象(Destroy()对已销毁对象无作用),甚至触发索引越界错误。
下面是修改后的完整脚本,我标注了关键修改点:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Wall : MonoBehaviour { public GameObject block; public int width = 10; public int height = 10; public int timeDestroy = 1; List<GameObject> blockList = new List<GameObject>(); void Start(){ // 生成方块的逻辑保持不变 for (int y=0; y<height; ++y) { for (int x=0; x<width; ++x) { Vector3 offset = new Vector3(x, 0, y); GameObject newBlock = Instantiate(block, transform.position + offset, Quaternion.identity); blockList.Add(newBlock); } } // 仅在Start中启动一次协程即可 StartCoroutine(SelfDestruct()); } // 移除Update中的SelfDestruct调用,避免重复启动协程 // void Update() { // SelfDestruct(); // } IEnumerator SelfDestruct() { // 循环执行:只要列表里还有方块就继续销毁 while (blockList.Count > 0) { // 等待指定的销毁间隔 yield return new WaitForSeconds(timeDestroy); // 随机选取一个有效的方块索引 int randomIndex = Random.Range(0, blockList.Count); GameObject blockToDestroy = blockList[randomIndex]; // 先从列表移除元素,避免后续访问无效对象 blockList.RemoveAt(randomIndex); // 销毁选中的方块 Destroy(blockToDestroy); } // 所有方块销毁完毕后,可在此添加游戏结束逻辑 Debug.Log("所有方块已销毁,游戏结束!"); } }
关键修改说明:
- 移除Update的协程调用:确保只启动一次协程,彻底避免多协程并行的逻辑混乱。
- 添加while循环:让协程持续运行,直到方块列表为空,实现逐个销毁的持续逻辑。
- 销毁前移除列表元素:每次销毁方块前先从
blockList中移除对应项,保证后续随机索引永远指向有效、未被销毁的方块,同时列表长度动态减少,直到循环自然结束。 - 优化变量命名:把原代码里的
hello改为newBlock,提升代码可读性。
修改后运行游戏,就能实现每隔1秒随机销毁一个方块,直到所有100个方块全部消失的效果啦。
内容的提问来源于stack exchange,提问作者JmeMcQ
相关产品推荐
相关产品推荐

