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

Unity报MissingReferenceException:移除列表元素后销毁对象仍出错

问题分析与解决方案

错误根源

你的代码里有两个关键问题导致了MissingReferenceException:

  1. 移除元素后错误访问列表索引:执行chunksList.Remove(chunksList[i]);后,列表长度减1,原本chunksList[i]的位置会被下一个元素占据,此时调用Destroy(chunksList[i]);销毁的根本不是你要处理的目标对象。真正该销毁的对象已从列表移除但未被销毁,后续可能被错误访问;同时当前循环里的索引混乱也会导致访问到无效对象。
  2. 正向遍历移除元素导致索引跳过:用for (int i = 0; i < chunksList.Count; i++)正向遍历并移除元素时,移除一个元素后后面的元素会前移一位,下一次循环i递增会跳过前移后的元素,导致部分对象未被处理,甚至出现索引越界问题。

修复后的代码

float chunkLength = 10f;

void Update()   
{
    MoveChunks();
}

void MoveChunks()
{
    // 反向遍历列表,避免移除元素导致的索引混乱
    for (int i = chunksList.Count - 1; i >= 0; i--)
    {
        chunksList[i].transform.Translate(-transform.forward * (chunkSpeed * Time.deltaTime));

        // 若块移动到相机后方则销毁该块
        if (chunksList[i].transform.position.z <= Camera.main.transform.position.z - chunkLength)
        {
            // 先缓存要销毁的对象,避免列表变化后访问错误元素
            GameObject chunkToDestroy = chunksList[i];
            chunksList.RemoveAt(i);
            Destroy(chunkToDestroy);
        }
    }
}

关键改动说明

  • 反向遍历:从列表末尾开始往前遍历,即使移除当前元素,前面的元素索引不受影响,不会出现跳过未处理元素的情况。
  • 缓存待销毁对象:先把目标对象存入临时变量,再执行移除和销毁操作,确保销毁的是正确的对象,不会因列表结构变化访问到错误元素。

内容的提问来源于stack exchange,提问作者Saptaparnee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:05:10