Как я могу установить разные значения для кнопок и передать их прослушиваемым функциям?

#c# #unity3d

#c# #unity3d

Вопрос:

У меня есть массив кнопок, используемых для выбора элементов из массива. То, что я пытаюсь сделать, это использовать одну функцию для обработки этого, как приведенный ниже код, вместо написания множества функций, просто выполняющих небольшую работу.

Тем не менее, кажется, что все эти кнопки установлены на последнюю i , и это выдает исключение «array out of bound» каждый раз, когда я нажимаю на кнопку.

Есть ли лучший способ сделать это?

Я подумал о поиске индекса нажатой кнопки, но это кажется мне странным и может быть медленным.

 public Button[] MPS;

 for(int i = 0; i < gm.MP.Length; i  )
 {
   MPS[i].onClick.AddListener(() => MPButtonHandle(i));
 }

void MPButtonHandle(int i)
{
    MP = gm.MP[i];
};
  

Комментарии:

1. Ваше условие цикла проверяется, gm.MP.Length пока вы обращаетесь MPS к телу. Это должно быть правильно?

2. Ах да, потому что MPS — это массив кнопок для выбора MP. Это больше, чем размер MP. На самом деле есть коды для отключения избыточных кнопок после этого. но я их не показывал.

Ответ №1:

В основном вам нужно создать локальную копию переменной i:

 public Button[] MPS;
for(int i = 0; i < gm.MP.Length; i  )
{
    int j = i;
    MPS[i].onClick.AddListener(() => MPButtonHandle(j));
}

void MPButtonHandle(int i)
{
    MP = gm.MP[i];
};
  

Причиной всего этого является механизм, называемый замыканиями. Вы можете найти больше информации об этом здесь:c # closures

Комментарии:

1. Спасибо за помощь. Решена моя проблема