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

Unity中For循环绑定按钮点击事件始终返回相同值问题求助

问题解决:Unity循环绑定按钮点击事件参数全部为0的问题

问题原因

核心问题是闭包的变量引用捕获特性加上代码逻辑错误导致的:

  • 你在循环里直接用成员变量ButtonNum作为委托参数,但这个变量从未在循环内赋值,始终保持初始值0,所以所有按钮点击都会传入0。
  • 就算你把ButtonNum换成循环变量i,也会因为闭包捕获的是i的引用而非当前值,循环结束后i会变成数组长度,最终所有按钮都传入同一个错误值。

修复方案

在循环内部创建局部变量保存当前索引,让每个委托捕获独立的变量实例:

public void Start()
{
    for (int i = 0; i < ButtonsPage.Length; i++)
    {
        // 创建局部变量保存当前循环的索引
        int currentIndex = i;
        ButtonsPage[i].GetComponent<Button>().onClick.AddListener(delegate { ButtonClicked(currentIndex); });
    }
}

public void ButtonClicked(int i)
{
    Debug.Log("Clicked" + i);
    if (WhichType == "Nose")
    {
        NoseColor.sprite = NosesColor[i];
        NoseOutline.sprite = NosesOutline[i];
    }
}

简化写法(Lambda表达式)

也可以用Lambda表达式实现同样效果,代码更简洁:

public void Start()
{
    for (int i = 0; i < ButtonsPage.Length; i++)
    {
        int currentIndex = i;
        ButtonsPage[i].GetComponent<Button>().onClick.AddListener(() => ButtonClicked(currentIndex));
    }
}

额外说明

局部变量currentIndex在每次循环迭代中都会生成新的实例,闭包会捕获这个独立的实例,因此每个按钮的委托都会持有对应的正确索引,无需再依赖ButtonNum成员变量传递参数。

内容的提问来源于stack exchange,提问作者Karma idk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:45:54