EventSystem基于Input,可以对键盘,鼠标,触摸,以及自定义输入进行处理。
EventSystem本身是一个管理控制器,核心功能依赖InputModule和Raycaster模块。
InputModule用来处理Input数据,管理事件状态,和发送事件给GameObject。
Raycaster用来捕获哪些GameObject需要执行事件处理:
Graphic Raycaster 用于UI元素就是继承自Graphic的对象;
Physics2D Raycaster 用于2D物理碰撞元素,依赖于Collider2D;
Physics Raycaster 用于3D物理碰撞元素,依赖于Collider;
原理
EventSystem对象负责管理所有事件相关对象,该对象下挂载了EventSystem组件和StandaloneInputModule组件,前者为管理脚本,后者为输入模块。
Canvas对象下挂载了GraphicRaycaster负责处理射线相关运算,用户的操作都会通过射线检测来映射到UGUI组件上,InputModule将用户的操作转化为射线检测,Raycaster则找到目标对象并通知EventSystem,最后EventSystem发送事件让目标对象进行响应。
事件响应
方式1:实现IXXHandler接口,脚本挂在要点击的目标对象上面
public class EventTest : MonoBehaviour, IPointerClickHandler, IDragHandler,
IPointerDownHandler, IPointerUpHandler {
public void OnDrag(PointerEventData eventData) {
}
public void OnPointerClick(PointerEventData eventData) {
}
public void OnPointerDown(PointerEventData eventData) {
}
public void OnPointerUp(PointerEventData eventData) {
}
}
方式2:使用EventTrigger组件
EventTrigger组件是一个通用的事件触发器,它可以用来管理单个组件上的所有可能触发的事件,其使用方法有编辑器设定和动态设置两种。
编辑器设定方法是在指定组件上添加EventTrigger组件,然后为它添加触发事件类型,再为指定类型添加回调方法。这种做法的操作很简单,而且灵活性也相当高,想要跨脚本调用方法只需要鼠标拖一拖点一点就好。
想要更好地管理大量的事件触发和回调处理,尽量动态设置的方案:
protected void setupEventTrigger(GameObject target, UnityAction<BaseEventData> listener,
EventTriggerType type) {
if(target != null) {
EventTrigger trigger = target.GetComponent<EventTrigger>() as EventTrigger;
if(trigger == null) {
trigger = target.AddComponent<EventTrigger>();
}
trigger.triggers = new List<EventTrigger.Entry>();
EventTrigger.Entry entry = new EventTrigger.Entry();
entry.eventID = type;
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(listener);
trigger.triggers.Add(entry);
}
}
使用
UGUI使用
1、新建UGUI任意组件时,自动添加EventSystem对象(集成了EventSystem组件和StandaloneInputModule组件);
2、Canvas默认挂载了GraphicRaycaster组件,所以在Canvas对象之下的所有GUI对象都可以通过挂载脚本并且实现一些和事件相关的接口来处理事件;
3、参考“事件响应”章节,实现事件监听与处理;
场景物体使用
1、新建EventSystem对象;
2、Camera添加Physics2D Raycaster或者Physics Raycaster组件;
3、参考“事件响应”章节,实现事件监听与处理;