2016-01-23 77 views
1

我有以下代码:为什么我的Button没有正确地注册输出?

void Setup(CityBuilding[] buildings) { 
    foreach (CityBuilding building in buildings) 
    { 
     GameObject buildingDisp = Instantiate(singleGoodsDisplay); 
     //... Other stuff not relevent happens here 
     buildingDisp.GetComponent<Button>().onClick.AddListener(() => { ProcessClick(building); }); 
     Debug.Log(building); 
    } 
} 

private void ProcessClick(CityBuilding building) 
{ 
    Debug.Log(building); 
} 

底线是,我有一个保存为一个预制和实例化的几个按钮。我正在以一个lambda函数的形式向它添加一个onClick监听器。我传入一个数据对象。现在buildings是两个数组。我看到两个项目都被调试,但是,当我实际点击按钮时,我总是看到第二个项目被使用,而不是第一个项目。我不太确定我做错了什么。有什么想法吗?谢谢!

+0

我不知道在C#中的行为是否相同,但如果您在JavaScript中有类似的事情,那么点击发生时,本地“建筑物”将始终引用集合中的最后一个项目。 –

+0

显然它在C#5中被更改了,所以变量在每次迭代中都被视为“新”,因此无视。 –

回答

1

看来,对象引用没有保存,它只使用最新的。做什么工作是保存副本并通过它,如下所示:

void Setup(CityBuilding[] buildings) { 
    foreach (CityBuilding building in buildings) 
    { 
     CityBuilding temp=building; 
     GameObject buildingDisp = Instantiate(singleGoodsDisplay); 
     //... Other stuff not relevent happens here 
     buildingDisp.GetComponent<Button>().onClick.AddListener(() => { ProcessClick(temp); }); 
    } 
} 
+0

奇怪我从来没有见过这个 - 但是,太棒了! – Fattie

相关问题