Unity中List<List<GameObject>>触发ArgumentOutOfRangeException异常求助
解决ArgumentOutOfRangeException异常:拆分Inspector列表时索引越界问题
我想在Inspector里只维护一个采集方块列表,通过代码把它拆分成4个子类别列表,但运行后一直触发ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.异常,异常参数为index,调用栈指向BlockPlacing.cs的Start方法第16行。
现有代码
[SerializeField] private List<GameObject> blocks = new List<GameObject>(64); private List<List<GameObject>> _mineralsList = new List<List<GameObject>>(4); void Start() { for (int j = 0; j < 4; j++) { for (int i = 0; i < 4; i++) { _mineralsList[j].Insert(i, blocks[i]); } } }
我还试过用_mineralsList[j][i] = blocks[i]赋值,同样触发相同异常。
Inspector设置说明
Inspector中已为blocks列表添加了16个GameObject(4类,每类4个)。
问题原因
你初始化_mineralsList时只设置了容量为4,但并没有实际创建4个空的子列表。此时_mineralsList的Count还是0,直接通过_mineralsList[j]访问索引j(0-3)必然会触发索引越界异常。
另外,就算子列表创建了,当前代码逻辑也有问题:每次循环j都会重复往同一个子列表插入blocks[0]-blocks[3],而不是按类别拆分(比如blocks[0-3]给第1个子列表,blocks[4-7]给第2个,以此类推)。
修复方案
- 先初始化
_mineralsList的4个子列表 - 按正确的索引范围拆分
blocks列表到对应子列表
修正后的代码:
[SerializeField] private List<GameObject> blocks = new List<GameObject>(64); private List<List<GameObject>> _mineralsList = new List<List<GameObject>>(); void Start() { // 先创建4个空的子列表 for (int j = 0; j < 4; j++) { _mineralsList.Add(new List<GameObject>()); } // 按每4个一组拆分到对应子列表 for (int j = 0; j < 4; j++) { for (int i = 0; i < 4; i++) { // 计算当前元素在blocks中的索引:j*4 + i int blockIndex = j * 4 + i; // 先判断索引是否有效,避免blocks元素不足时出错 if (blockIndex < blocks.Count) { _mineralsList[j].Add(blocks[blockIndex]); } } } }
额外优化建议
- 可以在
Awake或OnValidate中做拆分,这样在编辑模式下也能看到结果(如果需要) - 添加校验逻辑,比如在
OnValidate中检查blocks的数量是否是4的倍数,避免运行时出错:
void OnValidate() { if (blocks.Count % 4 != 0) { Debug.LogError("blocks列表的元素数量必须是4的倍数!"); } }
内容的提问来源于stack exchange,提问作者Bloemenpot
相关产品推荐
相关产品推荐

