事件执行
在上一篇EventSystem中提到了在执行触摸和鼠标事件时候,会调用ExecuteEvents.Execute来执行相应的事件,现在我们一起来看下事件是如何被执行的。事件的执行主要设计两个类
EventInterface和ExecuteEvents。
EventInterface类
EventInterface中定义了一系列输入相关的接口。例如IPointerClickHandler点击事件接口。
一个组件在继承了IPointerClickHandler接口之后,实现OnPointerClick方法,就可以在点击的时候执行OnPointerClick方法。这些事件接口都继承自IEventSystemHandler。
ExecuteEvents类
上面提到的事件接口都会在ExecuteEvents里面被调用。ExecuteEvents类是个静态类,不能被实例化,所有的公共方法都通过ExecuteEvents.XXXX来调用。ExecuteEvents里声明了一个delegate的类型EventFunction,这是一个泛型委托:
然后对EventInterface里的除IEventSystemHandler所有的接口声明了一个EventFunction类型的委托变量和方法。
例如:
然后又声明了一系列属性,这些属性是获取上述委托变量的只读属性,用于在外部调用。
外部统一调用事件的方法是
在Execute方法内部,通过GetEventList获取targetGameObject上的T类型的组件列表,然后遍历这些组件,并执行EventFunction<T>委托functor(arg, eventData);
以IPointerClickHandler为例,funcor方法就会执行EventFunction类型的委托方法,调用的就是IPointerClickHandler接口的OnPointerClick方法。
现在我们了解到UGUI事件的执行:指定某个接口类型,由Execute方法调用目标对象的接口方法。
接下来看一下ExecuteEvents里面的其他方法介绍
ExecuteHierarchy从字面意思可以看到是按层级执行,在方法里面调用GetEventChain方法获取目标对象的所有父物体的Transform,然后遍历所有的Transform逐个调用Execute执行相应的事件,如果执行成功就return当前的Transform,否则return空
GetEventHandler是通过CanHandleEvent方法来判断目标对象及其父对象是否可以执行指定的事件,并且返回可以执行事件的GameObject。CanHandleEvent里面的判断标准就是判断目标对象上面的T类型组件的数量是否等于0.