UGUI源码解析(二)执行事件

执行事件

在上面的事件系统,其中我们讲到EventSystem可以通过ExecuteEvents这个类来执行事件,那么事件是如何执行的呢?这里涉及到了两个文件EventInterface和ExecuteEvents。

 

EventInterface类

EventInterface定义了一系列的跟输入有关的接口。例如IPointerEnterHandler(指针进入事件接口)。一个组件添加这个接口的继承之后,再实现OnPointerEnter方法,便可以接收到指针进入事件,也就是当鼠标滑入对象所在的区域之后,便会回调OnPointerEnter方法。这些接口全都继承自IEventSystemHandler,而后者也是声明在EventInterface里的接口。

例如:

public interface IPointerEnterHandler : IEventSystemHandler
{
    void OnPointerEnter(PointerEventData eventData);
}

 

ExecuteEvents类

以上这些接口都会在ExecuteEvents里被调用。ExecuteEvents类是个静态类,不能被实例化,所有的公共方法都通过ExecuteEvents.XXXX来调用。ExecuteEvents里声明了一个delegate的类型EventFunction,这是一个泛型委托:

public delegate void EventFunction<T1>(T1 handler, BaseEventData eventData);

然后对EventInterface里的除IEventSystemHandler所有的接口声明了一个EventFunction类型的委托变量和方法。

例如:

private static readonly EventFunction<IPointerEnterHandler> s_PointerEnterHandler = Execute;

private static void Execute(IPointerEnterHandler handler, BaseEventData eventData)
{
    handler.OnPointerEnter(ValidateEventData<PointerEventData>(eventData));
}

然后又声明了一系列属性,这些属性是获取上述委托变量的只读属性,用于在外部调用。

public static EventFunction<IPointerEnterHandler> pointerEnterHandler
{
    get { return s_PointerEnterHandler; }
}

而外部统一调用执行事件的方法是:

ExecuteEvents.Execute(t.gameObject, currentPointerData, ExecuteEvents.pointerEnterHandler);

在方法内部,通过GetEventList获得targetGameObject上的T类型的组件列表,然后遍历这些组件,并执行EventFunction<T>委托functor(arg, eventData);。

以pointerEnterHandler为例,我们可以了解functor这个方法实际上执行的是我们上面声明的EventFunction类型的委托方法:

handler.OnPointerEnter(ValidateEventData<PointerEventData>(eventData));

也就是调用了IPointerEnterHandler类型的组件的OnPointerEnter方法。

至此,我们就了解到了UGUI里的事件是如何执行的:指定某个接口类型,由Execute方法调用目标对象的接口方法。

 

接着,补充一下ExecuteEvents类里面其他方法的介绍。

ExecuteHierarchy方法会通过GetEventChain获取target的所有父对象,并对这些对象(包括target)执行Execute方法。

GetEventHandler会遍历目标对象及其父对象,判断他们是否可以处理某个指定的接口事件,如果可以,把目标对象作为返回值返回。而判断方法是CanHandleEvent,通过GetEventList方法获取target上的T类型的组件列表,判断列表数量不为零。GetEventHandler主要在输入模块里被调用,用于获取某个输入事件的响应对象。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值