Unity Event Trigger

Event Trigger 从 Event System 接收事件并执行注册的方法。使用 Event Trigger 可以方便的添加一个或多个自己想要监听的常用 UI 事件,对于每个事件都可以设置多个回调,当接收到事件时相应的回调会被执行。

下面主要就来看看 EventTrigger 类的源码实现。

EventTrigger 实现了常用的所有的 Event System 中的事件接口,因此当给一个 GameObject 添加了 EventTrigger 组件之后,当有任何注册事件被当前 GameObject 拦截,那么这些事件都将不会再次被向上分发出去。

EventTrigger 类内部定义了一个 Entry 类,这个类很简单,如下:

1
2
3
4
5
public class Entry
{
public EventTriggerType eventID = EventTriggerType.PointerClick;
public EventTrigger.TriggerEvent callback = new EventTrigger.TriggerEvent();
}

仅包含两个成员变量: EventTriggerType 枚举类型的事件类型 eventID,它指定了另一个成员变量 callback 回调方法会在哪类事件下被回调;另一个成员变量是 EventTrigger.TriggerEvent 类型(继承自 UnityEvent 类)的 callback,这里面存储的就是将会在指定事件类型下触发然后回调的方法。

类中有一个主要的成员变量 m_Delegates,定义如下:

1
2
3
[FormerlySerializedAs("delegates")]
[SerializeField]
private List<EventTrigger.Entry> m_Delegates;

这个成员变量就是在编辑器中自定义编辑的事件类型以及对应的回调方法,如下图:

unity_event_trigger_1.jpeg

上图示 EventTrigger 在编辑器中使用

它是会被被序列化的,在编辑器我们可以设置想要监听的事件类型以及事件触发回调方法。

在 EventTrigger 实现所有的 Event System 中的接口方法中,都调用了本身类的 Execute 方法,比如 OnPointerEnter:

1
2
3
4
public virtual void OnPointerEnter(PointerEventData eventData)
{
this.Execute(EventTriggerType.PointerEnter, (BaseEventData) eventData);
}

再来看看这个类里面唯一一个比较重的方法 Execute:

1
2
3
4
5
6
7
8
9
10
private void Execute(EventTriggerType id, BaseEventData eventData)
{
int index = 0;
for (int count = this.triggers.Count; index < count; ++index)
{
EventTrigger.Entry trigger = this.triggers[index];
if (trigger.eventID == id && trigger.callback != null)
trigger.callback.Invoke(eventData);
}
}

同样也很简单,根据每个不同的事件类型 EventTriggerType,遍历当前类成员变量 m_Delegates 所保存的所有事件类型以及回调方法,匹配则执行回调方法。

看到这里,这个类主要的成员变量以及方法流程就看完了。EventTrigger 类代码很简单,它的作用只是为我们监听 Event System 通用事件提供一层封装,方便使用。

再回顾前面的文章《Unity Messaging System》中的内容,当 Event System 处理输入事件并找到合适的接收者,将该接收者作为参数执行 ExecuteEvents 类中的 ExecuteExecuteHierarchy 方法;如果此时该接收对象 GameObject 绑定了 EventTrigger 组件,由于 EventTrigger 类实现了所有常用的 UI 事件接口(即实现了 IEventSystemHandler 接口),因此会执行 EventTrigger 类中相应事件接口对应的方法,转而执行 EventTrigger 类的 Execute 方法,最终回调在编辑器中设定的方法。

unity_event_trigger_2.jpeg

上图示 Event Trigger 事件流程图