四时宝库

程序员的知识宝库

游戏开发中界面设计的秘密武器,Unity引擎强大的UI系统 —— UGUI

在游戏开发的世界中,用户界面(UI)是玩家与游戏互动的重要桥梁。它不仅需要美观,还要实用、响应迅速。在Unity中有个强大的UI系统——UGUI,看看它是如何打造令人印象深刻的界面。

什么是UGUI?

UGUI,全称Unity GUI,是Unity 4.x版本引入的一个强大的UI系统,它被设计来替代老旧的NGUI系统,提供了更高效、更灵活的方式来创建和管理游戏的用户界面。

Unity 5开始,它被重命名为UnityEngine.UI,但人们通常还是习惯称之为UGUI

作为Unity官方的UI系统,UGUI不仅支持2D和3D界面的创建,还提供了一个直观的编辑器,使得创建交互式UI元素如按钮、文本框和滑动条变得轻而易举。

此外,UGUI还支持响应式设计和自动布局,以适应不同设备的屏幕尺寸和分辨率

与旧版的OnGUI系统相比,UGUI在用户体验上做了显著提升,且作为一个开源的系统,它鼓励游戏开发者积极参与到游戏界面的开发中来。

UGUI 系统有 3 个特点:灵活、快速、可视化。

对于游戏开发者而言,UGUI不仅运行效率高执行效果好,而且易于上手,方便扩展,与Unity 3D引擎的兼容性极佳。这些特性使得UGUI成为了Unity游戏开发中构建用户界面的首选工具。

UGUI系统原理

UGUI是3D网格下建立起来的UI系统,它的每个可显示的元素都是通过3D模型网格的形式建立起来的。当UI系统被实例化时,UGUI系统首先要做的就是构建网格

也就是说,Unity在制作一个UI元素时,都会先构建一个方形网格,再将图片放入网格内。可以理解成构建了一个3D模型,用一个网格绑定一个材质球,材质球内存放要显示的图片。

但这里有个问题,就是如果每个元素都生成一个模型且绑定一个材质球存入一张图片,那么界面上成千上万的元素就会有成千上万的材质球和图片,显然是不可能的,因为如果这样的话,GPU需要对每个材质球和网格都进行渲染,GPU的负担会很重。

UGUI确实对这一部分进行了优化,它将一部分相同类型的图片合并成一张图,然后将拥有相同图片、相同着色器的材质球指向同一个材质球,并且把分散的模型网格合并起来。这样就生成几个大网格、几个不同图集的材质球和几张图集(合并这一步是由Canvas实现的)。

不过UGUI并不是把所有的网格和材质球合并成一个,它只是把相同层级的元素,以及相同层级上拥有相同材质球参数的进行合并。

合并成一个网格,就相当于一个静止的模型,如果有任何元素被移动或者销毁,或者元素的参数被改变,就需要摧毁原来的网格,重新进行构建。

这样的操作会消耗很多的CPU内存,因此我们要想方设法地合并更多元素,减少重构次数。这也是UGUI性能优化的一个方向之一。

UGUI的事件系统

UGUI的事件系统由以下三个子版块组成:

EventSystem

事件系统主要是基于输入(键盘、鼠标、触摸或自定义输入)向应用程序中的对象发送事件,当然这需要其他组件的配合。

当你在GameObject中添加EventSystem时,你会发现它并没有太多的功能,这是因为EventSystem本身被设计成事件系统不同模块之间通信的管理者和推动者,它主要包含以下功能:管理正在使用的输入模块、管理哪个游戏对象被选中和管理射线检测

管理输入模块(InputModule)

EventSystem负责管理所有的输入模块(InputModule),它在Update中调用TickModules更新每一个模块,并在满足条件时调用模块的Process方法。

管理选中的游戏对象

当场景中有了新的被选中的对象,会通知之前选中的对象执行OnDeselect事件,通知新的对象执行OnSelect事件。

管理射线检测

EventSystem中,还有一个非常重要的函数RaycastAll(),主要是获取目标。这个方法会首先获取所有的BaseRaycast对象,调用其Raycast方法,然后对最后得到的结果进行排序(大部分情况下按深度进行排序,也有一些情况下会使用距离、排序顺序(SortingOrder,如果是UI则根据Canvas面板的Sort order,3D物体默认是0或者根据Sorting Layer作为排序依据))。

InputModules

输入模块是配置和定制事件系统主逻辑的地方。自带的输入模块有两个,一个是为独立输入(StandaloneInputModule),另一个是为触摸输入(TouchInputModule)

StandaloneInputModule是PC、Mac&Linux上的具体实现,而TouchInputModule是IOS、Android等移动平台上的具体实现,每个模块都按照给定配置接收和分派事件。运行EventSystem后,它会查看附加了哪些输入模块,并将事件传递给特定的模块。

而事件执行则通过ExecuteEvent类,这个类中定义了许多接口,比如鼠标按下、点击、拖拽等

Raycasters

Raycasters负责确定目标对象。给定一个屏幕空间位置,它们将收集所有潜在目标,找出它们是否在给定位置下,然后返回离屏幕最近的对象。系统提供了以下几种类型的Raycaster:

Graphic Raycaster:检测UI元素

Physics Raycaster:用于3D物理元素

Physics 2D Raycaster:用于2D物理元素

协作

EventSystem会在Update中调用输入模块的Process方法来处理输入消息。PointerInputModule的Process方法会调用EventSystem中的RaycastAll方法进行射线检测。

RaycastAll又会调用所有BastRaycaster的Raycast方法执行具体的射线检测操作,用以获取屏幕某个点下的所有目标。

获取完点击目标后,又会回到PointerInputModule,对其触发那些事件接口(IPointerClickHandler之类的)并传入PointerEventData参数 => 使用冒泡排序通知,直到有能处理对应IEventSystemHandler的UI接收为止(比如Button上的Text无点击事件,那就父物体Button接收)。

UGUI的核心组件

UGUI的组件化设计是其最大的亮点。以下是一些核心组件

1.Canvas:作为UGUI的根容器,所有的UI元素都挂载在Canvas下。Canvas可以设置为不同的渲染模式,以适应不同的UI需求。

2.Image:用于显示图片或颜色填充的矩形,是构建UI的基础元素之一。

3.Button:可点击的按钮,可以响应用户的点击事件,是最常见的交互元素。

4.Text:用于显示文本信息,是传递游戏信息的重要组件。

5.Input Field:允许用户输入文本的字段,常用于登录界面或搜索框。

6.Scrollbar和Slider:用于控制内容的滚动和选择一个值的范围。

7.Toggle和Dropdown:开关按钮和下拉菜单,用于布尔值的选择和多个选项的选择。

布局与适配

UGUI提供了多种布局组件,如Horizontal Layout Group和Vertical Layout Group,这些组件可以自动排列子元素,大大简化了布局的工作。CanvasScaler组件则帮助UI元素适配不同分辨率的屏幕,确保UI在各种设备上都能正确显示。

动画与交互

UGUI还支持动画,可以使用Animator组件来控制UI元素的动画效果,使得UI更加生动有趣。同时,Event System组件处理用户输入,如点击、拖动等,使得UI元素能够响应玩家的操作。

UGUI是Unity中一个强大的UI系统,它为开发者提供了创建专业级用户界面所需的所有工具和组件。无论是简单的菜单,还是复杂的交互界面,UGUI都能轻松应对。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接