我遇到了这个问题,并试图解决它将近一个小时。我分享这些只是为了防止任何人面临同样的问题。为了更清楚地解释问题和答案,这里有一个例子:
1( 假设您动态创建一些按钮对象,并将它们添加到列表中:
private void CreateButtons(int length)
{
for (int i = 0; i < length; i++)
{
var newButton = Instantiate(buttonPrefab);
buttonList.Add(newButton);
}
}
2( 然后您想将相同的功能分配给不同的按钮,但具有不同的参数:
以下是指定的方法:
private void Test(int a)
{
print(a);
}
这是分配循环:
private void AssignClickEvents()
{
for (int i = 0; i < buttonList.Count; i++)
{
buttonList[i].GetComponent<Button>().onClick.AddListener(() => { Test(i); });
}
}
上面代码的问题是,当点击一个按钮时,它不会给你0,1,2…等等。所有按钮都会给你相同的值,这是循环参数"i"的最后一个赋值。检查解决方案的答案:
我不知道这背后的确切原因,但为了让事情顺利进行,你需要使用一个局部变量作为函数参数。这是代码:
private void AssignClickEvents()
{
for (int i = 0; i < buttonList.Count; i++)
{
int a = i;
buttonList[i].GetComponent<Button>().onClick.AddListener(() => { Test(a); });
}
}
我希望它能有所帮助!