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

