unity 监测UI EventTrigger事件

如果想控制 只是监听点击一次 :设置Image的 Raycast Target 的bool值(这样子就不用反复的注销,注册监听了,注销只在销毁的时候)

 

EventTrigger的所有事件类型
PointerEnter = 0 鼠标进入
PointerExit = 1 鼠标离开
PointerDown = 2 鼠标按下
PointerUp = 3 鼠标抬起
PointerClick = 4 鼠标点击(鼠标抬起时已不在原UI上时不会触发,在PointerUp之后调用)
Drag = 5 鼠标拖拽
Drop = 6 拖拽结束时鼠标不在被拖拽UI上并且在另外一个UI上时触发(在PointerUp之后)
Scroll = 7 滑轮滚动时
UpdateSelected = 8 被选中后的每一帧
Select = 9 在被选中时
Deselect = 10 结束选中时
Move = 11 按方向键时
InitializePotentialDrag = 12 初始化拖拽(在PointerDown之后,PoinerUp之前调用,点击就会调用)
BeginDrag = 13 拖拽开始(鼠标按下不移动不会触发)
EndDrag = 14 拖拽结束
Submit = 15 默认为Enter键
Cancel = 16 默认为Esc键
————————————————

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public struct EventCallbackData {
    public EventTrigger eventTrigger;
    public UnityAction<BaseEventData> callback;
}

public class EventTriggerListener : MonoBehaviour
{
   // public delegate void MouseEvent(BaseEventData data);

    public static Dictionary<string, EventCallbackData> eventDict = new Dictionary<string, EventCallbackData>();

    #region 事件管理

    /// <summary>
    /// 给目标物体添加响应事件
    /// </summary>
    /// <param name="target">目标物体</param>
    /// <param name="type">事件类型</param>
    /// <param name="call">响应函数</param>
    /// <param name="callId">响应函数的唯一标识符,用于后期移除事件</param>
    public static void AddListener(GameObject target, EventTriggerType type, UnityAction<BaseEventData> myFunction, string callId = null)
    {
        if (callId != null && eventDict.ContainsKey(callId))
        {
            Debug.LogError("响应函数标识符被占用:" + callId);
            return;
        }
        EventTrigger eventTrigger = target.GetComponent<EventTrigger>();
        if (!eventTrigger)
        {
            eventTrigger = target.AddComponent<EventTrigger>();
        }
        //获取事件列表
        List<EventTrigger.Entry> entries = eventTrigger.triggers;
        EventTrigger.Entry entry = new EventTrigger.Entry();
        bool isExist = false;
        for (int i = 0; i < entries.Count; i++)
        {
            if (entries[i].eventID == type)
            {
                entry = entries[i];
                isExist = true;
            }
        }
       // UnityAction<BaseEventData> action = new UnityAction<BaseEventData>(call);
        if (callId != null)
        {
            EventCallbackData data = new EventCallbackData();
            data.callback = myFunction;
            data.eventTrigger = eventTrigger;
            eventDict.Add(callId, data);//添加事件信息进入字典
        }
        entry.callback.AddListener(myFunction);
        if (!isExist)
        {
            entry.eventID = type;
            eventTrigger.triggers.Add(entry);
        }
    }

    /// <summary>
    /// 移除指定的事件响应
    /// </summary>
    /// <param name="type">事件类型</param>
    /// <param name="callId">响应函数标识符</param>
    public static void RemoveListener(EventTriggerType type, string callId) {
        if (!eventDict.ContainsKey(callId))
        {
            Debug.LogError("事件移除失败!没有找到对应的事件标识符:" + callId);
            return;
        }
        EventCallbackData data = eventDict[callId];
        EventTrigger eventTrigger = data.eventTrigger;
        EventTrigger.Entry entry = GetEntry(eventTrigger,type);
        if (entry!=null)
        {
            entry.callback.RemoveListener(data.callback);
        }
    }

    /// <summary>
    /// 移除某一种事件的所有响应函数
    /// </summary>
    /// <param name="target">目标物体</param>
    /// <param name="type">事件类型</param>
    public static void RemoveListeners(GameObject target, EventTriggerType type)
    {
        EventTrigger eventTrigger = target.GetComponent<EventTrigger>();
        EventTrigger.Entry entry = GetEntry(eventTrigger, type);
        if (entry != null)
        {
            entry.callback.RemoveAllListeners();
        }
    }

    /// <summary>
    /// 移除物体身上所有的响应事件
    /// </summary>
    /// <param name="target">目标物体</param>
    public static void RemoveAllListeners(GameObject target)
    {
        EventTrigger eventTrigger = target.GetComponent<EventTrigger>();
        if (!eventTrigger)
        {
            return;
        }
        //获取事件列表
        List<EventTrigger.Entry> entries = eventTrigger.triggers;
        for (int i = 0; i < entries.Count; i++)
        {
            entries[i].callback.RemoveAllListeners();
        }
    }

    /// <summary>
    /// 获取指定事件的回调条目对象
    /// </summary>
    /// <param name="eventTrigger">EventTrigger组件</param>
    /// <param name="type">事件类型</param>
    /// <returns></returns>
    static EventTrigger.Entry GetEntry(EventTrigger eventTrigger,EventTriggerType type) {
        if (!eventTrigger)
        {
            return null;
        }
        //获取事件列表
        List<EventTrigger.Entry> entries = eventTrigger.triggers;
        for (int i = 0; i < entries.Count; i++)
        {
            if (entries[i].eventID == type)
            {
                return entries[i];
            }
        }
        return null;
    }

    #endregion


}

猜你喜欢

转载自blog.csdn.net/qq_37524903/article/details/123667369
今日推荐