You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:36:06