Unity中如何按名称访问多个对象?ArgumentOutOfRangeException报错如何解决
问题解决方法
你收到的ArgumentOutOfRangeException是访问List元素时,索引值超出了列表的有效范围(0到Count-1)导致的,报错栈已经指向了LevelManager.cs第27行的List取值操作,也就是你代码里oList[a]这一行,具体问题和修正方案如下:
错误点说明
- for循环终止条件逻辑错误
你写的i == oList.Count不符合循环遍历的逻辑:正常遍历List所有元素的终止条件应为i < oList.Count。原有写法只有当i和列表长度完全相等时才会进入循环,i初始值为0,只有列表长度为0时才会进入一次循环,其余情况要么完全不执行,要么进入循环时i已经等于列表长度,此时取对应索引的元素直接越界。 - 循环索引变量使用错误
你在循环内没有使用定义的循环变量i,而是使用了外部变量a:如果a的初始值不在0~oList.Count-1的范围内,或者在循环多次执行后a自增到大于等于oList.Count,就会直接触发索引越界。
修正后代码
// 遍历oList所有元素 for(int i = 0; i < oList.Count; i++) { // 直接用循环变量i做索引,不需要额外的a变量 GameObject.Find(oList[i]).GetComponent<Image>().color = GreenCol; }
优化建议
- 尽量不要在循环内调用
GameObject.Find,这个接口性能开销很高,建议提前把oList里存的名称对应Image组件缓存到列表里,直接遍历修改即可。 - 如果oList本身存的就是GameObject对象,不需要用名称查找,直接调用
oList[i].GetComponent<Image>()即可,性能更高也不会出现查找不到对象的空引用问题。
内容的提问来源于stack exchange,提问作者efkansenol
相关产品推荐
相关产品推荐

