您当前的位置: 首页 >  unity

云小川

暂无认证

  • 4浏览

    0关注

    78博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

unity 监测UI EventTrigger事件

云小川 发布时间:2022-03-22 18:41:13 ,浏览量:4

如果想控制 只是监听点击一次 :设置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 callback;
}

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

    public static Dictionary eventDict = new Dictionary();

    #region 事件管理

    /// 
    /// 给目标物体添加响应事件
    /// 
    /// 目标物体
    /// 事件类型
    /// 响应函数
    /// 响应函数的唯一标识符,用于后期移除事件
    public static void AddListener(GameObject target, EventTriggerType type, UnityAction myFunction, string callId = null)
    {
        if (callId != null && eventDict.ContainsKey(callId))
        {
            Debug.LogError("响应函数标识符被占用:" + callId);
            return;
        }
        EventTrigger eventTrigger = target.GetComponent();
        if (!eventTrigger)
        {
            eventTrigger = target.AddComponent();
        }
        //获取事件列表
        List 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 action = new UnityAction(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);
        }
    }

    /// 
    /// 移除指定的事件响应
    /// 
    /// 事件类型
    /// 响应函数标识符
    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);
        }
    }

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

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

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

    #endregion


}

关注
打赏
1663746399
查看更多评论
立即登录/注册

微信扫码登录

0.0373s