【问题标题】:Unity 4.6, how to stop clones sharing listener?Unity 4.6,如何停止克隆共享监听器?
【发布时间】:2014-09-13 02:57:19
【问题描述】:

在 Unity 4.6 中试用新的 uGUI,编写按钮脚本...遍历目录并为每个文件创建一个按钮... AddListener 位中 f.Name 的值应为每个按钮独立设置。相反,每个按钮都具有要处理的最后一个 f.Name 的值(目录中按字母顺序排列的最后一个文件)。有什么想法吗?

foreach (FileInfo f in fileInfo) {
    Button btnCurrLvl = (Button) Instantiate(btnLvl);

    btnCurrLvl.GetComponentInChildren<Text>().text = f.Name.Remove(f.Name.Length-5);

    Debug.Log(f.Name); // f.Name is different every time
    btnCurrLvl.name = f.Name; // renaming the btns works
    btnCurrLvl.GetComponent<Button>().onClick.AddListener(() => LoadLocalLvl(f.Name)); // all the listeners on all created buttons are set to the last value of f.Name!?
}

【问题讨论】:

  • 请使用 unity3d 解决此类问题。

标签: c# unity3d listener


【解决方案1】:

在 foreach 循环中使用 lambda 表达式时要小心。以下代码:

var someList = new List<int> {1, 2, 3, 4};
var listOfClosures = new List<Func<int>>();
foreach (int v in someList)
{
    listOfClosures.Add( () => v );
}

(或多或少)等价于:

var someList = new List<int> {1, 2, 3, 4};
var listOfClosures = new List<Func<int>>();
int v;
for (int i = 0; i < someList.Count; i++)
{
    v = someList[i];
    listOfClosures.Add( () => v );
}

请注意,v 被声明为超出 for 循环的范围,然后仅在每次传递时重新分配。另请注意,闭包只保留对变量 v 的引用。因此,listOfClosures 中的每个闭包在调用时都将返回 4(最后一个值 v 被分配)。

你的情况也是如此:

foreach (FileInfo f in fileInfo) {
    btnCurrLvl.GetComponent<Button>().onClick.AddListener(() => LoadLocalLvl(f.Name));
}

所有的闭包都会引用同一个 f。 尝试在每个循环传递中创建新变量:

foreach (FileInfo f in fileInfo) {
    var name = f.Name;
    btnCurrLvl.GetComponent<Button>().onClick.AddListener(() => LoadLocalLvl(name));
}

【讨论】:

    【解决方案2】:
    string captured;
    foreach (FileInfo f in fileInfo) {
      Button btnCurrLvl = (Button) Instantiate(btnLvl);
      btnCurrLvl.GetComponentInChildren<Text>().text = f.Name.Remove(f.Name.Length-5);
      btnCurrLvl.name = f.Name;
      captured = f.Name;
      btnCurrLvl.GetComponent<Button>().onClick.AddListener(() => LoadLocalLvl(captured));
    }
    

    :)

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多