Хочу массиву кнопкам, из 10 кнопок передать в событие OnClick метод Appropriation(i), с аргументом i, который будет увеличиваться. Суть: кнопка 1 имеет OnClick с Appropriation(1), кнопка 9 имеет OnClick с Appropriation(9). У меня выводится последняя итерация (9) на все кнопки, как сделать так что бы прибавлялись цифры
void Awake()
{
foreach (GameObject btn in buttons)
{
for (int i = 0; i < 9; i++)
btn.GetComponent<Button> ().onClick.AddListener(() => Appropriation(i) );
}
}
Я не понял зачем тут два цикла. Хотя даже с одним был бы тот же результат. Т.к. lambda выполнялась бы уже тогда, когда текущее значение i было бы конечным (уже было бы 9). Поэтому надо "захватить" копию этого значения. Это можно сделать объявив новую переменную в цикле
for (int i = 0; i < buttons.Length; i++) {
int index = i;
buttons[i].GetComponent<Button> ().onClick.AddListener(() => Appropriation(index));
}
В Javascript тоже часто возникает подобная проблема при навешивании слушателя:
Повесить обработчики событий в цикле
Javascript forEach добавляет повторные вызовы на каждый элемент по размеру цикла
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости