先上截图
以上对应着Button的四种状态,至于各个属性的含义Unity也做到了见文知意,一目了然。
而里面最不常用的可能是Navigation了,这个是拿来干嘛的捏?
答案是拿来给手柄用的,也就是joystick。
点击Navigation下面的Visualize,切换到Scene视图,则会看到
其中的黄颜色的细线的指向就对应着手柄的移动方向,所指向的Button则为目的按钮。而点开Navigation下拉列表可以看到
共有5种模式,如果使用Explicit模式则可以手动指定各个按钮的转换关系。
还是很方便哒是吧。
下面开始说说代码
查看类图,
public class Button : Selectable, IPointerClickHandler, ISubmitHandler
实现了一堆的接口,都是用来处理用户交互的。继承自该类的子类就都继承了这些交互的功能。具体是怎么处理交互的请看下面的EventSystem。
继承自IEventSystemHandler,详见下文。
(红色预警,前方高能。你将知道自己注册的Button事件是在哪里调用的,经过了哪些流程)
接下来是Button的事件处理,这也是Button的重点。
从全局来看, 按钮是我们使用的最频繁的组件了。而我们把它放在Scrollbar,Slider等其他的兄弟姐妹中,它就只能算”老幺”了,就是年龄最小最单纯的那一个了哈哈。额。跑题了。。。回到正题,最简单地它实现的接口就只有2个。所以如果要谈Button,就非Selectable不可,它抽象实现了几个基本的IEventSystemHandler,而程序的原则是有实现就要有调用,谁来调用这些实现呢?答案是EventSystem,所有的ugui交互事件都是靠EventSystem来驱动的。
就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与用户交互的调用流程了(其他接口也类似)。
同上。
UI
EventSystem
(还没有开始看,所以暂空。)
原文点击这里
附:由于本人图形学知识浅薄,接触UGUI也仅半年,故文中若有错误疏漏,请一定提出并轻喷~我一定会更正补充的哦@_@