C# 添加带有委托的按钮侦听器以停止更新方法参数

C# 添加带有委托的按钮侦听器以停止更新方法参数,c#,unity3d,button,delegates,C#,Unity3d,Button,Delegates,假设我在Unity中有一个画布,我想在其中创建5个按钮。每次我按下一个按钮,它都会显示这是按钮n.I,其中I从0变为4。这是我到目前为止一直在使用的代码: public Button buttonPrefab; //set from inspector void SetButtons() { Button newObj; for (int i = 0; i < 5; i++) { //loop 5 times, creates a button using butt

假设我在Unity中有一个画布,我想在其中创建5个按钮。每次我按下一个按钮,它都会显示
这是按钮n.I
,其中
I
从0变为4。这是我到目前为止一直在使用的代码:

public Button buttonPrefab; //set from inspector
void SetButtons()
{
    Button newObj;
    for (int i = 0; i < 5; i++)
    { //loop 5 times, creates a button using buttonPrefab and assign ButtonNumber() method to it
        newObj = Instantiate(buttonPrefab, transform);
        newObj.onClick.AddListener(delegate { ButtonNumber(i); });
    }
}
void ButtonNumber(int nButton)
{
    Debug.Log($"This is button n.{nButton}");
}
但我不认为这是一个“聪明”的解决方案

我能做些什么来让按钮在第一个脚本中工作吗?

只需更改为:

  var x = i;
  newObj.onClick.AddListener(delegate { ButtonNumber(x); });

所发生的事情被称为“捕获”i变量,您可以在其中找到大量的问题和答案,例如:

我觉得自己太愚蠢了,因为我没有试过!非常感谢你,没必要。聪明的程序员在第一次遇到c#bug时,甚至在博客上发表了关于发现c#bug的文章!你有好朋友!:-)我很好奇,这是我们想要的功能吗?看起来这可能导致更多的错误而不是好处。这在哪里是有益的呢?在这个世界上,几乎没有什么东西像C#规范那样有充分的理由,所以是的,它是有意的。是的,这让许多程序员感到困惑。请允许我建议进一步阅读:
  var x = i;
  newObj.onClick.AddListener(delegate { ButtonNumber(x); });