Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity 4.6,如何阻止克隆共享侦听器?_C#_Unity3d_Listener - Fatal编程技术网

C# Unity 4.6,如何阻止克隆共享侦听器?

C# Unity 4.6,如何阻止克隆共享侦听器?,c#,unity3d,listener,C#,Unity3d,Listener,在Unity 4.6中试用新的uGUI,编写按钮脚本。。。遍历目录并为每个文件创建一个按钮。。。AddListener位中的f.Name值应为每个按钮单独设置。相反,每个按钮都有要处理的最后一个f.Name的值(目录中按字母顺序排列的最后一个文件)。有什么想法吗 foreach (FileInfo f in fileInfo) { Button btnCurrLvl = (Button) Instantiate(btnLvl); btnCurrLvl.GetComponentI

在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!?
}
foreach(FileInfo中的FileInfo f){
按钮btnCurrLvl=(按钮)实例化(btnLvl);
btnCurrLvl.getComponentChildren().text=f.Name.Remove(f.Name.Length-5);
Debug.Log(f.Name);//f.Name每次都不同
btncurrlvlvl.name=f.name;//重命名BTN有效
btnCurrLvl.GetComponent().onClick.AddListener(()=>LoadLocalLvl(f.Name));//所有已创建按钮上的所有侦听器都设置为f.Name的最后一个值!?
}

在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=新列表{1,2,3,4};
var listOfClosures=新列表();
foreach(someList中的int v)
{
添加(()=>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 );
}
var someList=新列表{1,2,3,4};
var listOfClosures=新列表();
INTV;
for(int i=0;iv);
}
请注意,v声明在for循环的范围之外,然后仅在每次传递时重新分配。还要注意,闭包只保留对变量v的引用。因此,listOfClosures中的每个闭包在调用时都将返回4(最后一个值v被赋值)

在您的情况下也会发生同样的情况:

foreach (FileInfo f in fileInfo) {
    btnCurrLvl.GetComponent<Button>().onClick.AddListener(() => LoadLocalLvl(f.Name));
}
foreach(FileInfo中的FileInfo f){
btnCurrLvl.GetComponent().onClick.AddListener(()=>LoadLocalLvl(f.Name));
}
所有闭包都将引用相同的f。 请尝试在每个循环过程中创建新变量:

foreach (FileInfo f in fileInfo) {
    var name = f.Name;
    btnCurrLvl.GetComponent<Button>().onClick.AddListener(() => LoadLocalLvl(name));
}
foreach(FileInfo中的FileInfo f){
变量名称=f.名称;
btnCurrLvl.GetComponent().onClick.AddListener(()=>LoadLocalLvl(名称));
}
捕获的字符串;
foreach(FileInfo中的FileInfo f){
按钮btnCurrLvl=(按钮)实例化(btnLvl);
btnCurrLvl.getComponentChildren().text=f.Name.Remove(f.Name.Length-5);
btnCurrLvl.name=f.name;
捕获=f.名称;
btnCurrLvl.GetComponent().onClick.AddListener(()=>LoadLocalLvl(已捕获));
}

:)

请使用unity3d回答此类问题。
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));
}