创建工程
对于UI来说,2D或3D工程没有差别,但是如果选择了3D工程,图像会默认以Textures导入,所以需要在导入之后修改成Sprites。
慎用Unity自带的图片
做UI时,Unity提供了一些自带的图片,但是这些图片没有在一张spritesheet上,它们需要单独的绘制调用(draw call),这样会影响性能。
文本控件
- 材质属性:基本的文本控件不支持Font Atlases,但是可以通过扩展来支持。材质属性可以用来应用shader。
Tips: 在脚本中,如果要得到某个组件,可以在Awake()函数中获得后保存,这样就不用在每次使用时获得,并且可以添加如果没有获得相应组件的处理代码,当然也可以通过[RequireComponent(typeof(Text))]来保证Text组件的存在。
Input Field
- Placeholder Text:只在用户没有输入时显示
Image
其实,panel只是一个设置了source image的image而已
Preserve Aspect:不论Rect Transform怎么变,图像的aspect不变
Set Native Size:将Rect Transform设置为图像的初始尺寸。
图像类型
simple
Sliced
Tiled:将图像在RectTransform的区域内平铺起来,而不会拉伸。如果设置的sprite包含了border,可能会看起来比较奇怪。
下图为正常的情况:
Fill:最炫酷的方式。
怎样合理的放置Animation和Animator
可以新建一个Animation的文件夹,然后在该文件夹内建一个Clip一个Controller共两个子文件夹。
- 在Controller文件夹内新建一个Animator Controller
- 为需要添加动画的Game Object添加一个Animator组件,指定Controller
- 选中Game Object后,打开Animation窗口,新建一个Animation,并且保存到先前创建的Clip文件夹中
- 添加到GameObject中的Animation会自动在Animator Controller中创建新的state。
RawImage
Image和RawImage的唯一区别在于RawImage使用纹理而不是Sprite。除了高级的纹理导入设置
之外,使用Texture的优势在于,可以使用它来显示从网上下载的图片,因为需要将下载的图片流转换成纹理
。
Button
button是一堆组件的集合。
What makes it selectable?
要让一个Selectable组件可以正常工作,必须要有一个能够与当前raycast系统交互的组件,默认情况下,需要一个Image组件与默认的Graphic’s Raycaster一起运作。当然也可以使用其他的raycasts,但是你需要添加相应的检测组件(比如:一个带有physics collider的网格可以应用Physics Raycaster)。
Selectable控件默认管理的事件有:
OnPointerEnter/OnPointerExit(hover/highlighted)
OnPointerDown/OnPointerUp(pressed)
Transition的种类:
ColorTint
SpriteSwap:根据控件的状态更换目标图像
Animation:根据控件的状态,Animation Controller会根据提供的名称来激活动画。使用动画进行transition,首先需要对button添加Animator controller component,并进行相应的动画编辑。
None:什么也不做。
Selectable组件有一个很好的特征,它能够添加到UI画布中任何一个GameObject,所以如果想让text对touch/mouse做出反应,可以对text添加该组件,甚至可以做一个自定义版的Selectable控件。
【注意】如果想要完整的响应各种事件,还需要添加EventTrigger组件或者一个实现了Event接口的脚本(就像button脚本一样)。下图显示了不同的event类型。
An event occurred, what do I do?
图形化的事件链接。
默认情况下,Selectable组件监听事件,但是Button也需要在事件发生时做一些事情,为了实现这些,按钮控件需要实现IEventSystemHandler以及IPointerClickHandler接口。
【注意】这些接口仅仅是EventSystem的一部分,EventSystem自动寻找实现了这些接口的组件和脚本。按钮和EventTrigger组件类似,它被设计用来专门处理一些时间以及避免处理所有的事件。
我们可以将来自事件系统的点击事件和Unity Editor中其他所有的东西关联起来,包括脚本方法(非静态)、GameObject属性、GameObject组件。
- Runtime Selector:决定在编辑器或者游戏中运行,或者关闭该事件同时又不会失去已经存在的设置;
- Object Selector:可以选择场景中甚至整个工程中的对象;
- Action Selector:基于你选择的对象,在Action Selector中有不同的选择。通常会列出已选择对象的所有组件以及在每一个组件中有很多可以作用的属性或方法。
- Value Selector:3中选择的Action决定是否会启用Value box,如果选择了可编辑的属性或者带有一个参数的脚本方法,就可以通过Value box设置属性或者给方法传递单个值。如果方法不需要参数,就不启用。【注意】带有多个参数的方法或者静态方法/类在编辑器中不支持。
按钮仅仅暴露了Click事件,如果想要包含更多的事件,则需要扩展基本的按钮控件。
Dynamic event properties
按钮空间中,事件没有附加信息,可是Toggle控件有一个布尔值的状态,它表示有一个潜在的输入可以使用,或者传递给任何想要执行的action,它们被称作dynamic parameters,并且在选择一个GameObject身上的action时作为单独的选项暴露出来
Sliding opportunities
Ancient scrolls
Navigation
控件navigation,即将焦点从一个控件到另一个控件。
【注意】Navigation只限于实现了Selectable组件的UI控件,比如:按钮,滑动条,开关等。
默认情况下,Unity通过在某个方向(上下左右)上查找最近的邻居来导航。有以下几种选项:
Automatic
Horizontal
Vertical
Explicit:对每一个控件详细指定上下左右的控件
None,关闭了控件之间的导航