Unity 当按钮点击事件需要传参,且放入for循环之后,报错:IndexOutOfRangeException: Index was outside the bounds of the array.

初始代码:

for(int i=0;i<sprite_火灾扑救二级场景类别UI.Length;i++)
        {
            if(sprite_火灾扑救二级场景类别UI[i].name.Contains(EventSystem.current.currentSelectedGameObject.name.Replace("Button_","")))
            {
                GameObject go = Instantiate(prefab_Button场景类别);
                go.transform.SetParent(scrollView_二级场景类别.transform.GetChild(0).GetChild(0));
                go.GetComponent<Image>().sprite = sprite_火灾扑救二级场景类别UI[i];
                go.name = "Button_" + sprite_火灾扑救二级场景类别UI[i].name;
                //go.GetComponent<Button>().onClick.AddListener(delegate { Button二级场景类别(sprite_火灾扑救二级场景类别UI[i].name); });
                go.GetComponent<Button>().onClick.AddListener(()=> Button二级场景类别(sprite_火灾扑救二级场景类别UI[i].name));
            }
        }

报错:

问题分析:

当您使用lambda表达式()=> Button二级场景类别(i)时,i是被“捕获”为闭包中的变量。但是,由于lambda表达式是在for循环中定义的,而for循环会改变i的值,因此所有通过lambda表达式添加的监听器实际上都会捕获到循环结束时的i的最终值,而不是在添加监听器时的当前i值。

为了解决这个问题,您需要在每次迭代中“固定”i的值。这通常可以通过在循环内部创建一个新的局部变量来实现,该变量在每次迭代时都会被赋予i的当前值。然后,您可以在lambda表达式中使用这个新的局部变量。但是,由于C#的闭包特性,直接这样做通常仍然会引用外部变量i(除非您显式地创建一个新的作用域,如通过另一个方法调用或局部变量)。

然而,在Unity的上下文中,有一个更简单的方法可以使用:您可以利用Button组件的name或其他唯一属性来存储或识别需要传递给Button二级场景类别方法的值,而不是直接传递i。然后,在监听器内部,您可以根据按钮的这些信息来查找或计算出正确的值。

修改后:

for(int i=0;i<sprite_火灾扑救二级场景类别UI.Length;i++)
        {
            if(sprite_火灾扑救二级场景类别UI[i].name.Contains(EventSystem.current.currentSelectedGameObject.name.Replace("Button_","")))
            {
                GameObject go = Instantiate(prefab_Button场景类别);
                go.transform.SetParent(scrollView_二级场景类别.transform.GetChild(0).GetChild(0));
                go.GetComponent<Image>().sprite = sprite_火灾扑救二级场景类别UI[i];
                go.name = "Button_" + sprite_火灾扑救二级场景类别UI[i].name;
                string name = sprite_火灾扑救二级场景类别UI[i].name;
                //go.GetComponent<Button>().onClick.AddListener(delegate { Button二级场景类别(sprite_火灾扑救二级场景类别UI[i].name); });
                go.GetComponent<Button>().onClick.AddListener(()=> Button二级场景类别(name));
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林枫依依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值