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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:09:08