![Unity 2018 AR与VR开发快速上手](https://wfqqreader-1252317822.image.myqcloud.com/cover/133/36862133/b_36862133.jpg)
3.7 Unity GUI
Unity GUI提供了常用的UI(即用户界面),包括按钮、文本、文本框、滚动条、下拉框等。依次单击菜单选项“GameObject→UI”,从中选择需要添加的具体UI即可,如图3-41所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P63_4226.jpg?sign=1739150964-xB6uuowJ8oxQvxvwQAEqSknWSoX5J6La-0-7d77964d528a45ffbc82bf97303c47cc)
图3-41
Unity GUI所有对象都需要归集在画布(Canvas)游戏对象下,并且需要一个事件系统(Event System)游戏对象,如图3-42所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P63_4227.jpg?sign=1739150964-jcuzepsAyDlYlTg1HL9InUCohExWvw48-0-6ed60bb79acbb81efd3452aedbf7c951)
图3-42
3.7.1 渲染模式
渲染模式(Render Mode)如图3-43所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P64_4254.jpg?sign=1739150964-qAMgntiWD5vpRs1OZQfrrXnAXa6H0Zxu-0-9ee222812a38c7f3e81cc65d24aecfc0)
图3-43
1.屏幕空间-覆盖(Screen Space–Overlay)
该模式下,UI会始终出现在3D物体的最前方,如图3-44所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P64_4255.jpg?sign=1739150964-TnBvsSdU4VDRTZi0to0cj9zBaHotGPio-0-80d1e346ac923dbf8dce524a1d3b83c0)
图3-44
2.屏幕空间-摄像机(Screen Space–Camera)
该模式下,UI会出现在距离摄像机一定位置的距离上,其中Plane Distance就是UI所在平面距离摄像机的位置,如图3-45所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P65_4269.jpg?sign=1739150964-8rYaL1DDD4p7dIC5LrOhkWPOD0oRSGPQ-0-191497456596176e8bf255a43dd9ee78)
图3-45
3.世界空间(World Space)
该模式下,UI会变成一个场景中的平面对象,如图3-46所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P65_4270.jpg?sign=1739150964-JvBma9xgsge9s8BPt3aG5LCaFyRWKUhM-0-0897daf09831c14b3afc013cf2ec6942)
图3-46
3.7.2 矩阵变换(Rect Transform)
Unity GUI的游戏对象使用矩阵变换来设置位置,通过锚点(Anchors)属性来定位一个位置,可以是点、线或者面。根据锚点定位的位置来定位游戏对象的位置,如图3-47所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P66_4306.jpg?sign=1739150964-SevOFFCr2W7KMNJQv4nR9JlYPRzyFtl6-0-b2edb77ba2dfe67b63cf1dc008d8b897)
图3-47
Unity提供了一些预设的常用锚点,方便使用者使用,如图3-48所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P66_4307.jpg?sign=1739150964-qPNWCucttcPhskRLKOQC4cD7kFhEakuK-0-100ae940b2e4ef77ee27f64ac27c7022)
图3-48
1.绝对定位
以父游戏对象的某个点作为锚点时,子游戏对象不会因为父游戏对象的大小变化而跟着改变,会始终保持大小不变,但是界面的UI元素可能会因为屏幕大小的变化跑到屏幕显示区域以外,如图3-49所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P66_4308.jpg?sign=1739150964-U5M4mWjD3H8aROXFYrMJs8GWrnTBpUJV-0-7ba5b725f9417ad225f9749233f4f496)
图3-49
2.相对定位
以父游戏对象的某条线或区块为锚点时,子游戏对象会因为父游戏对象的大小变化而跟着改变,因此界面的UI元素不会因为屏幕大小的变化而跑到屏幕显示区域以外,如图3-50所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P67_4328.jpg?sign=1739150964-pIFyrfKgxnOD4kUeMWx0esRxtf86Cqus-0-383763833dfce5780aa1d1692ff774bd)
图3-50
3.7.3 响应脚本
Unity GUI响应UI事件的脚本有两种主要的方式:一种是结合Unity编辑器设置的脚本;另一种是完全在脚本中响应。
两种方法各有利弊:结合Unity编辑器设置的脚本代码简单,耦合低,可以方便地复用,但是脚本多的时候相互之间的逻辑不易看出来;完全在脚本中设置的话,代码略显复杂,但是可以统一管理逻辑。
1.结合Unity编辑器设置的脚本
新建一个脚本,拖到一个空的游戏对象下,如图3-51所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P67_4338.jpg?sign=1739150964-6BehpvdGBkMYkxLudOWCT7G7sjnVLI9l-0-3b5c8f07471658db05e4d5eab3852ad0)
图3-51
脚本中需要一个公有的方法,内容如下:
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P67_25284.jpg?sign=1739150964-LbBK1pU65WeJkIkj55DHG4f06SHRJiUr-0-afa4f589f46cdb76261b7f7b3cb64267)
以按钮为例,选中“Button”游戏对象,单击“On Click”标签下的“+”按钮,将包含脚本的游戏对象“GameMaster”拖到其中,在下拉列表中设置响应单击事件的方法是“GUIController”脚本的“OnClicked”方法,如图3-52所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P68_4374.jpg?sign=1739150964-TqDO45dmHJYqR50uKNCMMz2Aoj46UdWI-0-a97e372cf757639947c91f803ef2d403)
图3-52
运行以后,单击按钮就能在控制台窗口看到提示信息,如图3-53所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P68_4375.jpg?sign=1739150964-ncdzBDgFE15f2sxRGKUsqILz7Brv2fQn-0-b15da9e4567888a3ae4f795bcdd2207e)
图3-53
这种方法还可以传参数,Unity简单的基本类都可以当作参数。
在脚本中添加以下内容:
public void OnClicked(string str){ Debug.Log(str); }
界面设置和之前一样,设置完成之后会多出一行,用于输入参数,如图3-54所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P68_4376.jpg?sign=1739150964-W75ycbG3kHIV3wGFsUDZe8tGK0DsxOLi-0-e1eed1b178b7c7e303b13e342f1c1de7)
图3-54
此时运行效果如图3-55所示,单击后显示参数的内容。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P69_4413.jpg?sign=1739150964-1KWxiTPQlmh7A9R8tnXctSbGHfTzUt4Z-0-40868fa75ebb2274aef0ddebdaf993bd)
图3-55
2.完全在代码中响应
在脚本中添加如下代码,设置脚本所在的按钮游戏对象之单击响应事件:
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P69_25292.jpg?sign=1739150964-U7tYun23AL2GzV1AaQLSjwtrSaTpVrwl-0-25c7001824f9866d043ffb7012b921de)
只要将脚本拖到按钮游戏对象上成为组件即可,不需要更多设置,如图3-56所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P69_4404.jpg?sign=1739150964-O4YVPJsx19VDhNOt6BOZUuGa5MfKuPnJ-0-22e36c6aa1048e66c2b857b9cf01e508)
图3-56
其他UI设置的方法都是类似的,如图3-57所示。
![](https://epubservercos.yuewen.com/8A3A4C/19549639508907106/epubprivate/OEBPS/Images/Figure-P69_4405.jpg?sign=1739150964-ihOAA6nmm9uBFcMIaVZF1sf2Sn5yRRNX-0-df352ff6b7ae704db8d73a936d2cb768)
图3-57