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

Unity C#中Button onClick绑定参数异常问题咨询

Unity按钮点击监听索引异常问题解答

问题1:为何所有按钮点击都返回相同索引?

这是闭包捕获变量的引用特性导致的。你在lambda表达式() => Load(i)中捕获的是变量i的引用,而非循环执行到当前按钮时i的具体数值。当整个循环执行完毕后,i已经被更新到最终的数值,所有按钮的点击事件触发时,都会读取这个最终的i值,因此点击任意按钮都会返回相同的索引。

问题2:为何i停在44却返回45?

循环的执行逻辑是:每处理一个Button,先为其添加点击监听,再执行i++。假设你的ScrollView内共有45个Button,循环会完整执行45次:

  • 第1次循环:i=0,添加监听后i自增为1
  • ...
  • 第45次循环:i=44,添加监听后i自增为45
    循环结束后,i的最终值就是45。而所有按钮的监听都引用这个最终的i变量,因此点击时返回45。

解决方法

在循环内部创建一个局部变量,保存当前循环的索引值,让lambda捕获这个局部变量的副本,避免引用同一个i:

int i = 0;
foreach(Button btn in scrollViewContent.GetComponentsInChildren<Button>()) {
    int currentIndex = i;
    btn.onClick.AddListener(() => Load(currentIndex));
    i++;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:08