UGUI源码学习之初涉Button(三)

UGUI源码学习之初涉Button(三)

Runtime

  • UI

先上截图

UGUI源码学习之初涉Button(三)_第1张图片

UGUI源码学习之初涉Button(三)_第2张图片

UGUI源码学习之初涉Button(三)_第3张图片

UGUI源码学习之初涉Button(三)_第4张图片


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

而里面最不常用的可能是Navigation了,这个是拿来干嘛的捏?

答案是拿来给手柄用的,也就是joystick。

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

UGUI源码学习之初涉Button(三)_第5张图片

其中的黄颜色的细线的指向就对应着手柄的移动方向,所指向的Button则为目的按钮。而点开Navigation下拉列表可以看到
共有5种模式,如果使用Explicit模式则可以手动指定各个按钮的转换关系。

代码说明为:
UGUI源码学习之初涉Button(三)_第6张图片

还是很方便哒是吧。


下面开始说说代码

查看类图,

UGUI源码学习之初涉Button(三)_第7张图片

public class Button : Selectable, IPointerClickHandler, ISubmitHandler

  • Selectable

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

  • IPointerClickHandler 和 ISubmitHandler

继承自IEventSystemHandler,详见下文。


红色预警,前方高能。你将知道自己注册的Button事件是在哪里调用的,经过了哪些流程

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

  • EventSystem

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

  • 关于IPointerClickHandler

就void OnPointerClick( PointerEventData eventData );一个函数接口

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

UGUI源码学习之初涉Button(三)_第8张图片

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

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

UGUI源码学习之初涉Button(三)_第9张图片

UGUI源码学习之初涉Button(三)_第10张图片

UGUI源码学习之初涉Button(三)_第11张图片

。。。

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

UGUI源码学习之初涉Button(三)_第12张图片


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

UGUI源码学习之初涉Button(三)_第13张图片

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

UGUI源码学习之初涉Button(三)_第14张图片

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

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

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

UGUI源码学习之初涉Button(三)_第15张图片

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

UGUI源码学习之初涉Button(三)_第16张图片


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

UGUI源码学习之初涉Button(三)_第17张图片

  • 关于ISubmitHandler

同上。


Editor

  • UI

  • EventSystem

(还没有开始看,所以暂空。)


原文点击这里
附:由于本人图形学知识浅薄,接触UGUI也仅半年,故文中若有错误疏漏,请一定提出并轻喷~我一定会更正补充的哦@_@

你可能感兴趣的:(【Unity3D】,button,ugui,unity,源码)