Невозможно записать метод в событие 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);
    });
}
→ Ссылка