0评论

UGUI源码学习之Button(三)

文章来自CSDN博客 2018-09-20 248浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

继续UGUI源码学习之旅的介绍,UGUI Button组件功能最多,应用最广,可以让我们的游戏界面变得美观。下面就介绍下Button的源码部分。

注意:官方只公开了UGUI源码的C#封装的这层,并未公开C++底层代码。

Runtime

  • UI
先上截图




以上对应着Button的四种状态,至于各个属性的含义Unity也做到了见文知意,一目了然。

其中Navigation是拿来给手柄用的,也就是joystick。

点击Navigation下面的Visualize,切换到Scene视图,则会看到

其中的黄颜色的细线的指向就对应着手柄的移动方向,所指向的Button则为目的按钮。而点开Navigation下拉列表可以看到

共有5种模式,如果使用Explicit模式则可以手动指定各个按钮的转换关系。

代码说明为:
还是很方便的。

下面开始说说代码

查看类图:
public class Button : Selectable, IPointerClickHandler, ISubmitHandler

  • Selectable
实现了一堆的接口,都是用来处理用户交互的。继承自该类的子类就都继承了这些交互的功能。具体是怎么处理交互的请看下面的EventSystem。

  • IPointerClickHandler 和 ISubmitHandler
继承自IEventSystemHandler,详见下文。

接下来是Button的事件处理,这也是Button的重点。

  • EventSystem
从全局来看, 按钮是我们使用的最频繁的组件了。而我们把它放在Scrollbar,Slider等其他的兄弟姐妹中,它就只能算”老幺”了,就是年龄最小最单纯的那一个了哈哈。额。跑题了……回到正题,最简单地它实现的接口就只有2个。所以如果要谈Button,就非Selectable不可,它抽象实现了几个基本的IEventSystemHandler,而程序的原则是有实现就要有调用,谁来调用这些实现呢?答案是EventSystem,所有的ugui交互事件都是靠EventSystem来驱动的。

  • 关于IPointerClickHandler
就void OnPointerClick( PointerEventData eventData );一个函数接口

我们在AddListener中注册的函数就是在这里调用的

你想知道的更多吗?比如是谁来调用 OnPointerClick 呢?想知道的更多?那就让我们来开始回溯之旅吧!

下面按回溯顺序截图,列出了我们逐步找到的调用的最高层(当然不包括引擎来调用我们哦)。最终找到了EventSystem的Update函数。




最后回溯到了EventSystem的Update函数中。 

那重点就是由EventSystem.Update()中调用的Process函数开始,这个Process函数就是接收并处理我们的输入事件,在Update中不停地刷(检测),看有没有需要处理的事件。我们”查找所有引用”发现这是BaseInputModule中的抽象函数,其”孙子”StandaloneInputModule和TouchInputModule实现了该函数。我们是做手游的嘛,所以重点放在TouchInputModule上。

由注释可知,我们经常调用的是ProcessTouchEvents()这个函数。

如果没有输入,Input.touchCount就为0。而一旦有了输入,就立即开始各种判断处理。

回到我们关心的话题,我们注册的回调函数好久开始调用呢?

那关键就是下面的这个handler是不是我们的Button脚本了(这里用接口来接收,Button实现了IPointerClickHandler)

如果handler是我们的Button,那EventSystem怎么得到它的呢?答案如下图。

最终我们的注册函数就是在functor中调用了。以上就是我们整个ugui与用户交互的调用流程了(其他接口也类似)。

关于ISubmitHandler
同上。

Editor
  • UI
  • EventSystem
来自:https://blog.csdn.net/a237653639/article/details/50804633