Unity 2D中遍历列表销毁全部对象时随机出现残留未销毁是什么原因?
问题根因分析
- 循环索引逻辑错误:for循环本身每次迭代会自动执行
i++,你又在遇到null元素时手动执行了一次i++,会直接跳过下一个索引位置的元素,这是平台残留的核心原因。 - 销毁判断逻辑错误:Unity的
Destroy方法不会立即销毁对象,而是在当前帧结束时才执行销毁操作,你在调用Destroy后立刻判断对象激活状态、列表元素是否为null,此时对象还未被销毁,判断逻辑完全无效。 - 列表未清空:所有平台对象销毁后,你没有清空
generatore.getPooled()列表,列表内会残留大量已销毁对象的无效引用,下次执行重置时遍历逻辑会更混乱。 - 边界越界风险:你添加的相邻元素为空判断逻辑没有做边界校验,当遍历到最后一个元素时访问
generatore.getPooled()[i + 1]会直接触发数组越界报错,属于完全冗余的错误逻辑。
修正后代码
public void Reset() { deathMenu.gameObject.SetActive(false); var pooledList = generatore.getPooled(); // 遍历所有元素直接销毁,不需要多余的索引操作和状态判断 for (int i = 0; i < pooledList.Count; i++) { if (pooledList[i] != null) { Destroy(pooledList[i].gameObject); } } // 清空列表,清除所有无效引用 pooledList.Clear(); player.transform.position = playerStartPoint; generatore.SetEndPosition(endPosition); player.gameObject.SetActive(true); scoreManager.scoreCounter = 0; scoreManager.scoreIncrease = true; }
如果你本身设计了对象池逻辑复用平台,不需要调用Destroy销毁对象,只要把所有存活平台设为非激活,再把生成起点重置到初始位置即可,反而能减少频繁创建销毁的性能开销。
内容的提问来源于stack exchange,提问作者Leonardo Moreo
相关产品推荐
相关产品推荐

