Присвоение различных событий нажатия кнопок одной и той же функции с параметром динамически - PullRequest
0 голосов
/ 20 февраля 2020

Я столкнулся с проблемой и почти час пытался ее решить. Я делюсь этим на всякий случай, если кто-то может столкнуться с той же проблемой. Для более ясного объяснения вопроса и ответа приведем пример:

1) Допустим, вы динамически создаете несколько объектов кнопок и добавляете их в список:

    private void CreateButtons(int length)
    {
        for (int i = 0; i < length; i++)
        {
            var newButton = Instantiate(buttonPrefab);

            buttonList.Add(newButton);
        }
    }

2) Затем Вы хотите назначить одну и ту же функцию различным кнопкам, но с разными параметрами:

Вот назначенный метод:

    private void Test(int a)
    {
        print(a);
    }

А вот назначение l oop:

    private void AssignClickEvents()
    {
        for (int i = 0; i < buttonList.Count; i++)
        {
            buttonList[i].GetComponent<Button>().onClick.AddListener(() => { Test(i); });
        }
    }

Проблема с приведенным выше кодом состоит в том, что при нажатии кнопки она не даст вам 0,1,2 ... et c. Все кнопки дают вам одно и то же значение, которое является последним назначенным значением l oop параметра 'i'. Проверьте ответ для решения:

1 Ответ

1 голос
/ 20 февраля 2020

Я не знаю точной причины этого, но чтобы все заработало, вам нужно использовать локальную переменную для параметра функции. Вот код:

    private void AssignClickEvents()
    {
        for (int i = 0; i < buttonList.Count; i++)
        {
            int a = i;
            buttonList[i].GetComponent<Button>().onClick.AddListener(() => { Test(a); });
        }
    }

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...