Unity 2020.3.30f1安卓2D游戏启动触发IndexOutOfRangeException错误的解决求助
解决Unity中IndexOutOfRangeException数组索引越界问题
嘿,看了你的错误日志和代码,问题很明确——setAchievs()方法里有几个低级错误直接导致了数组索引越界,咱们一个个来修复:
1. 无限循环导致索引溢出
你的for循环条件写反了:
// 错误写法:条件是1 < 数组长度,只要数组长度>1就无限循环 for (var i = 0; 1 < arrayTitles.Length; i++)
这里的1是硬编码的数字,不是循环变量i!这会让循环一直跑下去,i不断增大,直到超过arrayTitles和arraySprites的实际长度,触发IndexOutOfRangeException。
修正成:
for (var i = 0; i < arrayTitles.Length; i++)
2. 硬编码索引导致的越界+逻辑错误
循环里你直接写了arrayTitles[1],固定取索引1的元素:
// 错误写法:所有按钮都显示arrayTitles[1],数组长度<=1时直接越界 pr.GetComponentInChildren<Text>().text = arrayTitles[1];
这不仅会让所有成就按钮显示同一个标题,还会在你的成就数组长度小于等于1时直接触发索引越界。
修正成:
pr.GetComponentInChildren<Text>().text = arrayTitles[i];
3. 闭包陷阱导致点击事件逻辑错误
你在循环里定义了var i1 = 1;,然后把这个固定值传给点击事件:
var i1 = 1; pr.GetComponent<Button>().onClick.AddListener(() => GetAchievement(i1));
这会导致所有按钮点击都传入1,完全和当前循环的i无关。而且如果数组长度大于1,后面的按钮本应对应不同的索引,结果全成了1,逻辑完全错了。
修正成(捕获当前循环的i值,避免闭包陷阱):
int currentIndex = i; pr.GetComponent<Button>().onClick.AddListener(() => GetAchievement(currentIndex));
额外优化:避免数组长度不匹配+布局错误
还有两个小细节要注意:
- 确保
arrayTitles和arraySprites在Unity Inspector里长度一致,不然还是会有越界风险,可以加个判断:if (arrayTitles.Length > 0 && arraySprites.Length == arrayTitles.Length) - 你实例化按钮的时候是放到当前
AchMenu的Transform下,应该放到content的Transform里,不然VerticalLayoutGroup没法正确布局这些按钮:var pr = Instantiate(button, content.transform);
完整修正后的setAchievs()方法
void setAchievs() { RectTransform rectT = content.GetComponent<RectTransform>(); rectT.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f); RemovedList(); // 先检查两个数组长度一致且不为空 if (arrayTitles.Length > 0 && arraySprites.Length == arrayTitles.Length) { var pr1 = Instantiate(button, content.transform); var h = pr1.GetComponent<RectTransform>().rect.height; var tr = GetComponent<RectTransform>(); tr.sizeDelta = new Vector2(tr.rect.width, h * arrayTitles.Length); Destroy(pr1); for (var i = 0; i < arrayTitles.Length; i++) { var pr = Instantiate(button, content.transform); // 设置成就标题 pr.GetComponentInChildren<Text>().text = arrayTitles[i]; // 设置成就图标,额外加个索引判断兜底 if(i < arraySprites.Length) { pr.GetComponentsInChildren<Image>()[1].sprite = arraySprites[i]; } // 绑定正确的点击索引 int currentIndex = i; pr.GetComponent<Button>().onClick.AddListener(() => GetAchievement(currentIndex)); list.Add(pr); } } }
把这些改完之后,你的索引越界问题应该就能解决了,记得在Unity Inspector里确认arrayTitles和arraySprites都正确赋值了哦!
内容的提问来源于stack exchange,提问作者Mister Danila
相关产品推荐
相关产品推荐

