2016-01-23 2 views
1

У меня есть следующий код:Почему моя кнопка неправильно регистрирует вывод?

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); 
} 

Суть в том, у меня есть несколько кнопок, которые сохраняются в виде сборной и экземпляров. Я добавляю к нему прослушиватель onClick, в форме лямбда-функции. Я передаю объект данных. Прямо сейчас buildings представляет собой массив из двух. Я вижу, что оба элемента отлаживаются, однако, когда я нажимаю на кнопки, я всегда вижу, что второй элемент используется, а не первый. Я не совсем уверен, что я делаю неправильно. Есть предположения? Благодаря!

+0

Я не знаю, если поведение такого же в C#, но если вы имели подобную вещь в JavaScript, к тому времени, клик Иногда локальное 'building' всегда будет ссылаться на последний элемент коллекции. –

+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

Смежные вопросы