UG3L12——EventTrigger 事件触发器
UG3L12——EventTrigger 事件触发器
EventTrigger
事件触发器是EventTrigger
组件,它是一个集成了上节课中学习的所有事件接口的脚本
它可以让我们更方便的为控件添加事件监听
EventTrigger
可以让我们写更少的代码,可以在面板类中处理面板控件的事件逻辑,更加的面向对象,便于管理
如何使用事件触发器
需要声明一个参数为 BaseEventData
类型的方法,参数用来表示本次监听事件的具体数据(例如点击时间位置等)
可以根据使用的监听类型,将参数 as
成其派生类(例如用于 PointerEnter
的函数可以将参数 as
成 PointerEventData
使用)
-
拖脚本进行关联
假设要为按钮添加一个监听鼠标进入的事件
在Add New Event Type之后,在脚本内根据要求写好函数,然后将脚本挂载到某个对象(不一定要挂载到自己上)
将挂载脚本的对象拖入左下角的参数上,再选择拖入对象上的函数,
注意!需要选择动态参数类型的函数,否则参数不能获取到监听事件数据
1
2
3
4
5
6
7
8
9
10
11using UnityEngine;
using UnityEngine.EventSystems;
public class Lesson19 : MonoBehaviour
{
public void TestPointEnter(BaseEventData data)
{
PointerEventData eventData = data as PointerEventData;
print("鼠标进入" + eventData.position);
}
} -
代码添加
假设要为按钮添加一个监听鼠标按下后抬起的事件
-
首先需要申明一个希望监听的事件对象,类型为
Entry
,是EventTrigger
的内部类
设置好Entry
的监听类型(eventID
,EventTriggerType
即监听类型的枚举)和回调函数(callback
)1
2
3
4
5
6EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerUp; //这是监听鼠标指针抬起的事件
entry.callback.AddListener((data) =>
{
print("抬起");
}); -
将该
Entry
添加到EventTrigger
的triggers
当中(triggers
本质是Entry
类型的列表List<EventTrigger.Entry>
)1
2EventTrigger eventtrigger = GetControl<Button>("btnStart").gameObject.AddComponent<EventTrigger>();
eventTrigger.triggers.Add(entry);
如果有相同监听类型的函数要添加,可以重新声明一个对象,但这样较浪费内存
可以直接 在同监听类型的Entry
添加到列表前 再添加一个回调函数
也可以先遍历一遍列表,得到监听类型相同的Entry
,直接再往该Entry
的回调函数添加函数即可,
要注意该事件监听器队列是否真的有这种类型的****Entry
!1
2
3
4
5
6
7
8
9
10
11
12
13
14//重复步骤的
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerUp;
entry.callback.AddListener((data) =>
{
print("抬起");
});
//重复添加函数的步骤
entry.callback.AddListener((data) =>
{
print("抬起2");
});
eventTrigger.triggers.Add(entry);1
2
3
4
5
6
7
8
9
10
11
12//遍历列表的,要注意该事件监听器队列是否真的有这种类型的Entry!
foreach (var entry in eventTrigger.triggers)
{
if (entry.eventID == EventTriggerType.PointerUp)
{
entry.callback.AddListener((data) =>
{
print("抬起3");
});
}
} -