画布(Canvas)
该画布是所有UI元素应该是内部的区域。画布是一个具有Canvas组件的游戏对象,所有UI元素都必须是这样一个Canvas的子项。
使用菜单GameObject> UI> Image创建一个新的UI元素,如图像,如果场景中还没有Canvas,则会自动创建一个Canvas。UI元素作为一个子对象创建到此画布。
画布区域在场景视图中显示为一个矩形。这使得UI元素的定位变得容易,而无需随时可以看到游戏视图。
Canvas使用EventSystem对象来帮助消息系统。
绘制元素的顺序
画布中的UI元素按照它们在层次结构中出现的顺序绘制。第一个子对象是先画的,第二个子对象是下一个,等等。如果两个UI元素重叠,后面的将出现在前面的那个之上。
要更改哪个元素显示在其他元素的顶部,只需通过拖动层次结构中的元素重新排序。还可以通过在Transform组件上使用这些方法从脚本控制顺序:SetAsFirstSibling,SetAsLastSibling和SetSiblingIndex。
渲染模式
画布具有渲染模式设置,可用于使其在屏幕空间或世界空间中呈现。
屏幕空间 -叠加(Screen Space - Overlay)
这个呈现模式将UI元素放置在屏幕最顶部呈现。如果屏幕被调整或改变分辨率,画布将自动改变大小以匹配这个分辨率。
UI在屏幕空间叠加画布中
屏幕空间 -相机(Screen Space - Camera)
这类似于屏幕空间-叠加,但在这种渲染模式下,画布在指定的摄像机前放置一个给定的距离。这个摄像头渲染了UI元素,这意味着相机设置会影响UI的外观。如果将相机设置为透视,则将以透视的方式呈现UI元素。如果屏幕被调整大小,改变分辨率,或者摄像头的截屏变化,画布也会自动调整大小以匹配。
UI在屏幕空间相机画布
世界空间
在此渲染模式下,画布将与场景中的任何其他对象一样运行。可以使用其Rect Transform手动设置Canvas的大小,UI元素将基于3D放置呈现在场景中的其他对象之前或之后。这对于旨在成为世界空间一部分的UI是有用的。这也被称为"死亡界面"。
UI在世界空间画布
基本布局
在本节中,我们将介绍如何将UI元素相对于Canvas和彼此定位。如果要在阅读时测试自己,可以使用菜单GameObject - > UI - > Image创建图像。
矩形变换
该矩形变换是用于所有UI元素,而不是常规的一个新的转换组件转换组件。
Rect Transform具有像常规Transforms那样的位置,旋转和缩放,但它也具有宽度和高度,用于指定矩形的尺寸。
调整大小与缩放比例
当矩形工具用于更改对象的大小时,通常对于2D系统中的Sprites和3D对象,它将更改对象的局部缩放。然而,当它用于具有矩形变换的对象上时,它将改变宽度和高度,保持本地比例不变。此大小调整不会影响字体大小,切片图像上的边框等。
枢轴
旋转,大小和缩放修改围绕枢轴发生,因此枢轴的位置影响旋转,调整大小或缩放的结果。当设置为枢轴模式时,可以在"场景视图"中移动矩形变换的枢轴。
锚
Rect Transforms包括一个称为锚的布局概念。锚点在场景视图中显示为四个小三角形手柄,锚点信息也显示在检查器中。
如果一个Rect Transform的父项也是一个Rect Transform,那么可以通过多种方式将子Rect Transform转换为父Rect Transform。例如,孩子可以锚定到父母的中心,或者到其中一个角落。
UI元素锚定到父中心。元素保持与中心的固定偏移。
UI元素锚定到父级的右下角。元素保持固定的偏移到右下角。
锚定还允许孩子与父母的宽度或高度一起拉伸。矩形的每个角都有一个固定的偏移到其对应的锚点,即矩形的左上角有一个固定的偏移到左上方的锚点等。这样矩形的不同的角可以锚定到不同的点在父矩形。
UI元素左角固定在父窗口左下角,右角固定在右下角。元件的角部保持固定的偏移到它们各自的锚。
锚点的位置以父矩形宽度和高度的分数(或百分比)来定义。0.0(0%)对应于左侧或底侧,中间为0.5(50%),右侧或顶侧为1.0(100%)。但锚不限于边和中间; 它们可以锚定到父矩形内的任何点。
具有左角的UI元素锚定到从父母的左侧一定百分比的点,并且右角被锚定到从父矩形的右侧一定百分比的点。
您可以单独拖动每个锚点,或者如果它们在一起,则可以通过在它们之间的中间点击并拖动来将它们拖动在一起。如果在拖动锚点的同时按住Shift键,矩形的相应角将与锚点一起移动。
锚手柄的一个有用的特征是它们自动地卡扣到同心矩形的锚点,以允许精确的定位。
锚定预设
在检查器中,可以在Rect Transform组件的左上角找到" 锚定预设"按钮。单击该按钮将显示"锚定预设"下拉列表。从这里您可以快速选择一些最常见的锚定选项。您可以将UI元素锚定到父项的边或中间,或者与父大小一起展开。水平和垂直的锚定是独立的。
"锚定预置"按钮显示当前选择的预设选项(如果有)。如果水平轴或垂直轴上的锚点设置为与任何预设位置不同的位置,则会显示自定义选项。
在Inspector中的锚和位置字段
您可以点击锚定扩展箭头来显示锚点编号字段,如果它们不可见。Anchor Min对应于"场景视图"中的左下方锚点句柄,Anchor Max对应于右上方的句柄。
根据锚点是否在一起(其产生固定的宽度和高度)或分离(这导致矩形与父矩形一起拉伸),矩形的位置字段被不同地显示。
当所有锚手柄在一起时,显示的字段为Pos X,Pos Y,Width和Height。Pos X和Pos Y值表示枢轴相对于锚点的位置。
当锚点分离时,场可以部分或完全地变化为左,右,上和下。这些字段定义了由锚定义的矩形内的填充。如果锚点水平分离,则使用左右两个字段,如果垂直分隔,则使用顶部和底部字段。
请注意,更改锚点或枢轴域中的值通常会对定位值进行反向调整,以使矩形保持原样。如果不需要这种情况,可以使用检查器中的一个小按钮启用原始模式。这导致锚和枢轴值能够被改变而没有任何其他值改变作为结果。这可能导致矩形被视觉上移动或调整大小,因为其位置和大小取决于锚点和枢轴值。
互动组件
本节介绍用户界面系统中处理交互的组件,如鼠标或触摸事件以及使用键盘或控制器的交互。
交互组件本身不可见,并且必须与一个或多个可视元素组合才能正常工作。
共同功能
大多数互动组件有一些共同点。它们是可选项,这意味着它们具有共享内置功能,用于可视化状态(正常,突出显示,按下,禁用)之间的转换,以及使用键盘或控制器导航到其他可选项。
按键(Button)
一个按钮有一个OnClick UnityEvent(unity事件)来定义单击它会做什么。
有关使用Button组件的详细信息,请参阅Button页面。
切换(Toggle)
一个切换有一个"打开"复选框,用于确定切换是当前打开还是关闭。当用户单击切换时,该值被翻转,并且可以相应地打开或关闭视觉复选标记。它还有一个OnValueChanged UnityEvent来定义当值更改时它将执行什么操作。
有关使用Toggle组件的详细信息,请参阅Toggle页面。
切换组(Toggle Group)
可以使用切换组来分组互斥的一组切换。属于同一组的切换将受到约束,因此一次只能选择其中一个 - 选择其中一个将自动取消选择所有其他组。
有关使用切换组组件的详细信息,请参阅切换组页面。
滑块(Slider)
滑块具有十进制数值用户可以在最小值和最大值之间拖动的值。它可以是水平的或垂直的。它还有一个OnValueChangedUnityEvent来定义当值改变时它会做什么。
有关使用滑块组件的详细信息,请参阅滑块页面。
滚动条(Scrollbar)
滚动条具有十进制数值,介于0和1之间。当用户拖动滚动条时,值将相应地更改。
滚动条通常与滚动矩形和蒙版一起使用以创建滚动视图。滚动条的大小值介于0和1之间,决定了整个滚动条长度的一小部分。这通常由另一个组件控制,以指示滚动视图中内容的比例有多大可见。Scroll Rect (滚动矩形)组件可以自动执行此操作。
滚动条可以是水平还是垂直。它还有一个OnValueChanged UnityEvent来定义当值改变时它会做什么。
有关使用滚动条组件的详细信息,请参阅滚动条页面。
下拉框(Dropdown)
下拉列表中列出了可供选择的选项。可以为每个选项指定文本字符串和可选的图像,并且可以在检查器中设置,也可以从代码动态设置。它有一个OnValueChanged UnityEvent来定义当前选择的选项被更改时它会做什么。
输入字段
输入字段用于使用户可以编辑的文本元素的文本。它有一个UnityEvent来定义当文本内容被改变时它会做什么,另一个定义当用户完成编辑时它会做什么。
滚动矩形(滚动视图)[Scroll Rect (Scroll View)]
当需要占用大量空间的内容需要在小范围内显示时,可以使用Scroll Rect。Scroll Rect提供了滚动浏览此内容的功能。
通常,Scroll Rect与Mask相结合,以便创建一个滚动视图,其中只有Scroll Rect中的可滚动内容可见。它还可以与一个或两个可以拖动以水平或垂直滚动的滚动条组合。
有关使用Scroll Rect组件的详细信息,请参阅Scroll Rect页面。
消息系统
新的UI系统使用消息系统来替代SendMessage。该系统是纯C#,旨在解决SendMessage中存在的一些问题。该系统使用可以在MonoBehaviour上实现的自定义接口来指示组件从消息系统接收回调。当调用进行目标时,指定GameObject; 该调用将在实现指定接口的GameObject的所有组件上。消息传递系统允许传递自定义用户数据,以及事件应该传播的GameObject层次结构; 那就是它应该是为指定的GameObject执行,还是应该对子对象和父对象执行。除此之外,消息传递框架还提供了帮助函数来搜索和查找实现给定消息接口的GameObject。
消息传递系统是通用的,不仅可以由UI系统使用,还可以通过一般的游戏代码进行设计。添加自定义消息传递事件是相对简单的,它们将使用UI系统用于所有事件处理的相同框架。
如何定义自定义消息?
如果你想定义一个自定义的消息,它是比较简单的。在UnityEngine.EventSystems命名空间中,有一个名为'IEventSystemHandler'的基本接口。从此扩展的任何内容都可以被视为通过邮件系统接收事件的目标。
public interface ICustomMessageTarget : IEventSystemHandler
{
// functions that can be called via the messaging system
void Message1();
void Message2();
}
一旦这个接口被定义,那么它可以由MonoBehaviour实现。当实现它定义了如果给出的消息针对这个MonoBehaviours GameObject发出的函数将被执行。
public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
public void Message1()
{
Debug.Log ("Message 1 received");
}
public void Message2()
{
Debug.Log ("Message 2 received");
}
}
现在有了一个可以接收消息的脚本,我们需要发出消息。通常情况下,这将是响应一些发生的松散耦合事件。例如,在UI系统中,我们为诸如PointerEnter和PointerExit之类的东西发布事件,以及在对应用程序的用户输入作出响应时可能发生的各种其他事情。
要发送一个消息,有一个静态帮助类存在来做到这一点。作为参数,它需要消息的目标对象,一些用户特定的数据以及映射到消息接口中的特定功能的功能函数。
ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());
此代码将在实现ICustomMessageTarget接口的GameObject目标上的任何组件上执行Message1的函数。ExecuteEvents类的脚本文档涵盖了执行函数的其他形式,比如在子中或在父对象中执行。
EasyTouch与游戏输入
-
常规游戏输入
Unity支持键盘,操纵杆和游戏手柄输入。
可以在输入管理器(Input Manager)中创建虚拟轴和按钮,最终用户可以在屏幕上漂亮的配置对话框中配置键盘输入。
您可以设置操纵杆,游戏手柄,键盘和鼠标,然后通过一个简单的脚本界面访问它们。
虚拟轴
从脚本中,所有虚拟轴都以其名称访问。
创建时,每个项目都有以下默认输入轴:
- 水平和垂直被映射到w,a,s,d和箭头键。
- Fire1,Fire2,Fire3分别映射到Ctrl,Alt和Shift。
- 鼠标X和鼠标Y被映射到鼠标移动的增量。
-
Window Shake X和Window Shake Y被映射到窗口的移动。
添加新的输入轴
如果要添加新的虚拟轴,请转到Edit->Project Settings->Input 菜单。在这里,您还可以更改每个轴的设置。
你可以将每个轴分别映射到操纵杆、鼠标或键盘上的两个按钮。
属性:
功能:
Name(名称)
用于从脚本检查此轴的名称字符串。
Descriptive Name
(正描述性名称)
在独立构建的配置对话框的输入选项卡中显示的正值名称。
Descriptive Negative Name
(负描述性名称)
在独立构建的配置对话框的输入选项卡中显示的正值名称。
Negative Button
(负按钮)
用于将轴推向负方向的按钮。
Positive Button
(正按钮)
用于将轴推向正方向的按钮。
Alt Negative Button
(备用负按钮)
用于将轴推向负方向的替代按钮。
Alt Positive Button
(备用正按钮)
用于将轴推向正方向的替代按钮。
Gravity(轴重)
当没有按钮被按下时,轴以每秒为单位的速度转向中性的速度。
Dead(死区)
模拟死区的大小。在这个范围内的所有模拟设备值都映射到中性。
Sensitivity(灵敏度)
以每秒单位轴向目标值移动的灵敏度。这只适用于数字设备。
Snap(断裂)
如果启用,按下相反方向的按钮时,轴值将重置为零。
Invert(倒置)
如果启用,负按钮提供正值,反之亦然。
Type(类型)
控制轴的输入设备类型。
Axis(轴)
控制轴的连接装置的轴。
Joy Num(操纵杆)
连接操纵杆将控制这个轴。
使用这些设置来进行效果和输入的感觉微调。它们在编辑器中都带有提示。。
从脚本使用输入轴
您可以从脚本查询当前状态,如下所示:
value = Input.GetAxis ("Horizontal");
轴的值介于-1和1.中性位置为0.这种情况用于操纵杆输入和键盘输入的时候。
然而,鼠标增量和Window Shake增量是鼠标或窗口从上一帧到现在的移动。这意思是当用户快速移动鼠标时,它可能大于1或小于-1。
可以创建具有相同名称的多个轴。当得到输入轴时,将返回具有最大绝对值的轴。这使得为一个axis(轴)名分配多个输入设备成为可能。例如,为键盘输入创建一个轴,为具有相同名称的操纵杆输入创建一个轴。如果用户使用操纵杆,输入将来自操纵杆,否则输入将来自键盘。这样,您不必考虑在编写脚本时输入来自何处。
按钮名称
要映射一个键到一个轴,在Inspector(检查器)的正按钮或负按钮的属性中,必须输入键的名称。
按键
输入键的名称如下:
-
标准键: "a", "b", "c" ...
-
数字键: "1", "2", "3", ...
-
方向键: "up", "down", "left", "right"
-
小键盘键:"[1]", "[2]", "[3]", "[+]", "[equals]"
-
修改键:"right shift", "left shift", "right ctrl", "left ctrl", "right alt", "left alt"
-
鼠标按钮: "mouse 0", "mouse 1", "mouse 2", ...
-
操纵杆按钮(从任意操纵杆): "joystick button 0", "joystick button 1", "joystick button 2", ...
-
操纵杆按钮(从指定操纵杆): "joystick button 0", "joystick button 1", "joystick 1 button 0", ...
-
特殊键:"backspace(退格键)", "tab", "return", "escape", "space", "delete", "enter", "insert", "home", "end", "page up", "page down"
-
功能键:"f1", "f2", "f3", ...
在脚本和检视面板,用来识别键的名称是一样的。
value = Input.GetKey ("a");
注意:还可以使用KeyCode枚举参数访问按键。
-