整体流程

Button继承自SelectableIPointercliClickHandlerISubmitHandler

外部注册

IPointerClickHandler

IPointerClickHandler接口仅包含一个OnPointerClick()方法,当鼠标点击时会调用该接口的方法。而Button能触发点击事件是因为继承自IPointerClickHandler接口,并且重写了OnPointerClick方法。那IPointerClickHandler接口的方法又是被谁调用的呢?查找引用,发现是ExecuteEvents类的Execute方法,并且Execute方法赋值给s_PointerClickHandler字段。

没错,ExecuteEvents,和之前我在UGUI学习 - 事件系统、射线检测的分析一致。

AddListener

那么onClick.AddListener()的本质也可以挖一下,其实就是监听了 public ButtonClickedEvent onClick。而这个追溯到最底层,就是对一个回调方法队列进行List.Add()

Unity调用

也是和之前分析的一样,在Process方法体内进行循环检测、触发OnClick等。

EventSystem会在Update()中调用当前可用BaseInputModuleProcess()方法,该方法会处理鼠标的按下、抬起等事件,当鼠标抬起时调用ReleaseMouse()方法,并最终调用Execute()方法并触发IPointerClick事件。