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
相关产品推荐
相关产品推荐

