动态addListener to Toggle

时间:2017-02-23 05:08:17

标签: c# unity3d

我正在尝试创建一个动态添加的Toggles列表,该列表一直有效,直到我尝试向切换添加一个侦听器。传递给SelectColor的值应该为每个切换增加1,但传递的值恰好是数组的长度。将索引始终放在每个切换的最后一个索引之上。

foreach (HexLand color in colors) {
    Toggle option = Instantiate<Toggle> (ColorTogglePrefab);
    option.transform.SetParent (EditorOptions.transform);
    option.name = "Toggle " + color.Name;
    option.group = toggleGroup;
    if (i == 0) {
        option.isOn = true;
    } else {
        option.isOn = false;
    }
    option.GetComponent<HexLandOption> ().label.text = color.Name;
    option.onValueChanged.AddListener (delegate {
        SelectColor (i); // current usage has array length 2. i always returns 2.
    });
    i++;
  }
public void SelectColor(int index) {
    Debug.Log(index); // Writes 2 to console.
    activeColor = colors [index].Color;
}

我是否可以使用一种方法来确保每个切换正确返回其值?

1 个答案:

答案 0 :(得分:0)

您正在从外部范围捕获i。委托不会立即执行,所以在回调发生的那一刻,i已经有了最后一个值,即数组的长度。

在循环内创建另一个变量来存储迭代的值。

请参阅How to tell a lambda function to capture a copy instead of a reference in C#?