Помогите разобраться, как добавить метод на кнопку имея имя

Общие вопросы о Unity3D

Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение Rayzor 20 апр 2023, 23:51

Добрый вечер.

Подскажите, как, имея имя метода, добавить на кнопку в OnClick. У меня он либо игнорирует(как в данном случае) и ничего не происходит при нажатие, или выскакивает ошибка

Синтаксис:
Используется csharp
for (int i = 0; i < buttons.Count; i++)
        {
            if (buttons[i] != null) buttons[i].GetComponent<Button>().onClick.AddListener(() => this.GetComponent<ButtonsLogic>().GetType().GetMethod("DeviceOnOff").CreateDelegate(typeof(UnityAction), this.GetComponent<ButtonsLogic>()));
        }
 
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение Saltant 21 апр 2023, 02:08

В лямбду добавь публичный метод, зачем тебе рефлексия
Синтаксис:
Используется csharp
GetComponent<ButtonsLogic>().DeviceOnOff()
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение 1max1 21 апр 2023, 02:48

Ты же его не вызываешь через ()
((UnityAction)CreateDelegate(typeof(UnityAction), this.GetComponent<ButtonsLogic>()))()
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение Rayzor 21 апр 2023, 08:45

1max1 писал(а):Ты же его не вызываешь через ()
((UnityAction)CreateDelegate(typeof(UnityAction), this.GetComponent<ButtonsLogic>()))()


Он все равно не реагирует, в целом до метода не доходит, но и ошибок не показывает

Вы же это имели ввиду?
AddListener(() => ((UnityAction)this.GetComponent<ButtonsLogic>().GetType().GetMethod("DeviceOnOff").CreateDelegate(typeof(UnityAction), this.GetComponent<ButtonsLogic>()))());
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение Rayzor 21 апр 2023, 08:50

Saltant писал(а):В лямбду добавь публичный метод, зачем тебе рефлексия
Синтаксис:
Используется csharp
GetComponent<ButtonsLogic>().DeviceOnOff()


Потому что у меня два списка: строчек и кнопок, где первый список это название методов
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение 1max1 21 апр 2023, 09:29

Ну тогда раскидывай логи, у меня все работает.

Синтаксис:
Используется csharp
        btn.onClick.AddListener(() =>
        {
            UnityEngine.Debug.Log("onClick");

            var buttonsLogic = this.GetComponent<ButtonsLogic>();

            if (buttonsLogic == null)
            {
                UnityEngine.Debug.Log("buttonsLogic is null!");
            }
            else
            {
                var mi = buttonsLogic.GetType().GetMethod("DeviceOnOff");

                if (mi == null)
                {
                    UnityEngine.Debug.Log("mi is null!");
                }

                var mth = (UnityAction)mi.CreateDelegate(typeof(UnityAction), buttonsLogic);

                UnityEngine.Debug.Log("start invoke");

                mth();

                UnityEngine.Debug.Log("end invoke");
            }
        });
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение Rayzor 21 апр 2023, 15:47

1max1 писал(а):Ну тогда раскидывай логи, у меня все работает.

Синтаксис:
Используется csharp
        btn.onClick.AddListener(() =>
        {
            UnityEngine.Debug.Log("onClick");

            var buttonsLogic = this.GetComponent<ButtonsLogic>();

            if (buttonsLogic == null)
            {
                UnityEngine.Debug.Log("buttonsLogic is null!");
            }
            else
            {
                var mi = buttonsLogic.GetType().GetMethod("DeviceOnOff");

                if (mi == null)
                {
                    UnityEngine.Debug.Log("mi is null!");
                }

                var mth = (UnityAction)mi.CreateDelegate(typeof(UnityAction), buttonsLogic);

                UnityEngine.Debug.Log("start invoke");

                mth();

                UnityEngine.Debug.Log("end invoke");
            }
        });



Да, все заработало спасибо огромное
Последний раз редактировалось Rayzor 21 апр 2023, 16:03, всего редактировалось 2 раз(а).
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение 1max1 21 апр 2023, 15:58

Вроде бы код идентичный, по крайней мере в отрыве от контекста. Если скинешь полный код, то может там будет различия, хз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите разобраться, как добавить метод на кнопку имея имя

Сообщение Rayzor 21 апр 2023, 16:02

1max1 писал(а):Вроде бы код идентичный, по крайней мере в отрыве от контекста. Если скинешь полный код, то может там будет различия, хз.


Проблема была в том, что когда он попадал в if i увеличивалась на 1 и соответственно он вылезал за список

Еще раз спасибо за помощь
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8