Невозможно записать метод в событие OnClick с помощью цикла
Вот так работает и приводит к запланированному:
controller.moviesListPlayer[0].GetComponent<Button>().onClick.AddListener(() =>
{
performer.MoveWasSelect();
performer.healingMovies[0].HealMove(this);
});
controller.moviesListPlayer[1].GetComponent<Button>().onClick.AddListener(() =>
{
performer.MoveWasSelect();
performer.healingMovies[1].HealMove(this);
});
controller.moviesListPlayer[2].GetComponent<Button>().onClick.AddListener(() =>
{
performer.MoveWasSelect();
performer.healingMovies[2].HealMove(this);
});
controller.moviesListPlayer[3].GetComponent<Button>().onClick.AddListener(() =>
{
performer.MoveWasSelect();
performer.healingMovies[3].HealMove(this);
});
А так не работает (выводит ошибку о индексе вне массива ЕСЛИ событие onClick срабатывает):
for (int i = 0; i < 4; i++)
{
controller.moviesListPlayer[i].GetComponent<Button>().onClick.AddListener(() =>
{
performer.MoveWasSelect();
performer.healingMovies[i].HealMove(this);
});
}
Вопрос: почему?
Длина массивов moviesListPlayer и healingMovies статична и я устанавливал её вручную. Все элементы обоих массивов не являются null и принимаю те значения, которые мне нужны.
Сразу скажу, что сам цикл проходит гладко и проблемы появляются ТОЛЬКО если событие onClick сработает!
Ответы (1 шт):
Автор решения: Арман
→ Ссылка
Вам надо скопировать переменную i в локальную переменную прежде чем её использовать, потому что во время вызова события цикл уже закончился и i равно 4.
Попробуйте так:
for (int i = 0; i < 4; i++)
{
int iCopy = i;
controller.moviesListPlayer[iCopy].GetComponent<Button>().onClick.AddListener(() =>
{
performer.MoveWasSelect();
performer.healingMovies[iCopy].HealMove(this);
});
}