Unity报MissingReferenceException:移除列表元素后销毁对象仍出错
问题分析与解决方案
错误根源
你的代码里有两个关键问题导致了MissingReferenceException:
- 移除元素后错误访问列表索引:执行
chunksList.Remove(chunksList[i]);后,列表长度减1,原本chunksList[i]的位置会被下一个元素占据,此时调用Destroy(chunksList[i]);销毁的根本不是你要处理的目标对象。真正该销毁的对象已从列表移除但未被销毁,后续可能被错误访问;同时当前循环里的索引混乱也会导致访问到无效对象。 - 正向遍历移除元素导致索引跳过:用
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
相关产品推荐
相关产品推荐

