UGUI获取屏幕所有点击事件

​
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);
        }
        );

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值