2016-01-23 80 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

相關問題