Всем привет. Скажу сразу случай тяжелый, требуется эксперт). Программируя эвент нажатия UI кнопки столкнулся с одной проблемой.
Код
int i = 0; ShopInsets[i].onClick.AddListener(delegate {WindowShopInsetChange(i); }); i = 1;
Что тут происходит: ShopInsets[i] - Выбираем кнопку из массива, кнопка захеширована (.GetComponent<Button>()) Далее на эвент onClick т.е. клик мышкой назначаем метод delegate {WindowShopInsetChange(i); } delegate используется для того, чтобы метод можно было использовать с параметром (i), иначе работать отказывается. В чём собственно вопрос и почему такой кусок кода. Если мы кликнем мышкой по кнопке то в метод уйдет цифра 1, а не 0. Если же мы используем за место i просто число
Код
ShopInsets[i].onClick.AddListener(delegate {WindowShopInsetChange( i ); });
Это особенность работы делегатов - делегат не просто берет переменную "по ссылке", а имеет доступ ко всем локальным переменным метода, что его создал. Решается добавлением функции, которая "строит" делегаты,
Хорошая попытка, но к со жалению не работает. Насколько я знаю
ЦитатаYellowAfterlife ()
.onClick.AddListener
Эвент принадлежащий юнити, от сюда ошибка компилятора Ошибка CS1503 Аргумент 1: не удается преобразовать из "System.Action" в "UnityEngine.Events.UnityAction".
Добавлено (09 января 2016, 19:09) --------------------------------------------- Попробовал и так
Эвент принадлежащий юнити, от сюда ошибка компилятора Ошибка CS1503 Аргумент 1: не удается преобразовать из "System.Action" в "UnityEngine.Events.UnityAction".
Добавлено (09 января 2016, 19:09) --------------------------------------------- Попробовал и так
В первую очередь нужно было попробовать заменить возвращаемый тип функции на тот, который оно просит. Это работает. Обновил код в моем ответе.
По первому посту. Чтобы понять почему так происходит читаем про "замыкания". Например тут: http://habrahabr.ru/post/36601/ Например так должно работать
Код
int i = 0; int j = i; ShopInsets[i].onClick.AddListener(delegate {WindowShopInsetChange(j); }); i = 1;
Если j нигде в данном методе не меняется. Что, кстати в предыдущем посте и написали.
Сообщение отредактировал seaman - Понедельник, 11 Января 2016, 07:58