using UnityEngine;
using System;
using UnityEngine.EventSystems;
using System.Reflection;
public class EventSystemHandle<T1> : MonoBehaviour
{
protected Action<T1> montiorAction;
protected void RegisterExecuteEvent<B>(string fieldName = "",string firstType = "",string secType = "UnityEngine.EventSystems.BaseEventData") where B : IEventSystemHandler
{
FieldInfo pointerDownHandler = null;
var executeEventSType = typeof(UnityEngine.EventSystems.ExecuteEvents);
pointerDownHandler = executeEventSType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static);
Type[] paramTypes = new Type[] { pointerDownHandler.FieldType.Assembly.GetType(firstType), pointerDownHandler.FieldType.Assembly.GetType(secType) };
var executeMethod = executeEventSType.GetMethod("Execute", BindingFlags.Static | BindingFlags.NonPublic, Type.DefaultBinder, paramTypes, new ParameterModifier[] { new ParameterModifier(2) });
ExecuteEvents.EventFunction<B> eventFunction = new ExecuteEvents.EventFunction<B>(onItemExecte);
eventFunction += (ExecuteEvents.EventFunction<B>)Delegate.CreateDelegate(typeof(ExecuteEvents.EventFunction<B>), executeMethod);
pointerDownHandler.SetValue(null, eventFunction);
}
protected virtual void onItemExecte<B>(B x, BaseEventData y) where B : IEventSystemHandler { }
public void ReSetAction() { montiorAction = null; }
public void AddButtonListener(Action<T1> action) { montiorAction += action; }
public void RemoveButtonListener(Action<T1> action) { montiorAction -= action; }
}
using UnityEngine;
using System;
using UnityEngine.EventSystems;
using System.Reflection;
public class ButtonMonitor : EventSystemHandle<GameObject>
{
private void Start()
{
//OnSingletonInit();
}
public void OnSingletonInit()
{
RegisterExecuteEvent<IPointerClickHandler>("s_PointerClickHandler", "UnityEngine.EventSystems.IPointerClickHandler");
}
protected override void onItemExecte<T1>(T1 x, BaseEventData y)
{
if (y.selectedObject!=null && y.selectedObject.GetComponent<UnityEngine.UI.Button>())
montiorAction?.Invoke(y.selectedObject);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
GetComponent<ButtonMonitor>().OnSingletonInit();
GetComponent<ButtonMonitor>().AddButtonListener((go) =>
{
Debug.LogError(go.transform.name);
}
);
}
}