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