/// <summary> /// Подписывает элемент графического интерфейса на получение событий, которые для него доступны. /// /// Например, у стандартного грфического элемента Toggle есть событие onValueChanged, которое принимает делегат UnityAction<bool> /// Пусть у источника данных есть свойство MyToggle, которое связано с соответствующим GuiToggleBind. Тогда подписка на событие может выглядеть так: /// AddEventListener("MyToggle", "onValueChanged", (proxydata, args) => Debug.Log("MyToggle changed: " + (bool)args[0])); /// </summary> public GuiEventData AddEventListener(string bindName, string eventName, UniversalGuiEventDelegate callback) { GuiEventData guiEventData = null; IGuiBindable bindableData = _bindableGuiComponents.SingleOrDefault(data => data.GetBindName() == bindName); if (bindableData != null) { object unityEvent = bindableData.GetGuiComponent() .GetType() .GetProperyOrFieldValue(bindableData.GetGuiComponent(), eventName); if (unityEvent != null) { Type unityEventType = unityEvent.GetType(); UnityActionProxy proxyHandler = UnityActionProxy.Create(unityEventType, callback); guiEventData = new GuiEventData(bindName, eventName, bindableData, proxyHandler); RegisteredEvents.Add(guiEventData); unityEventType.GetMethod("AddListener") .Invoke(unityEvent, new object[] { proxyHandler.UnityActionDelegate }); } } return(guiEventData); }
private void CallRemoveListenerOnUnityEvent(GuiEventData guiEventData) { object unityEvent = guiEventData.GuiBindableData.GetGuiComponent() .GetType() .GetProperyOrFieldValue(guiEventData.GuiBindableData.GetGuiComponent(), guiEventData.EventName); if (unityEvent != null) { unityEvent.GetType().GetMethod("RemoveListener").Invoke(unityEvent, new object[] { guiEventData.UnityActionProxy.UnityActionDelegate }); } // TODO else? }