理解和使用 Unity UI 系统

随着 Unity 4.6 发布,新 UI 系统终于与大家见面了。这篇文章将不会介绍如何使用按钮、滚动条之类的UI控件,这些内容可以参考Unity Manual;这篇文章的重点是,如何理解 UI 系统的设计,以便更好的在实际中使用、自定义和扩展。

EventSystem

如果你使用 UI 系统,那么 EventSystem 对象会自动创建。这个对象负责监听用户输入。默认情况下,在电脑上可以使用键盘和鼠标输入,在移动设备上可以使用触摸输入。但是如果你要为surface这样的设备开发,你也可以同时启用两种输入。当需要屏蔽用户输入时,将此对象关闭即可。UnityEngine.EventSystems.EventSystem.current 保存了当前活动的 EventSystem 对象。

Canvas

Canvas 是其他所有 UI 对象的根。在一个场景里 Canvas 数量和层级都没有限制。子 Canvas 使用与父 Canvas 相同的渲染模式。一个 Canvas 有三种渲染模式:

Screen Space - Overlay:UI元素相对于屏幕空间,以2D方式显示在任何相机画面的上面。这是非常标准的 UI 风格。典型例子:大量窗口、文本和按钮的策略游戏。

Screen Space - Camera:UI元素相对于屏幕空间,由指定的相机负责显示,相机的参数影响显示的结果。你可以把 Canvas 理解为相机的子物体。典型例子:射击游戏屏幕上的 3D HUD。

World Space:UI元素相对于世界空间,和其他场景里的物体一样有世界位置、遮挡关系。通常用来做非常创新的 UI 设计。例子:游戏内的手机屏幕、与场景绑定的游戏指导等。

CanvasScaler

这个组件负责屏幕适配。UI 系统使用 RectTransform 来计算 UI 的位置和大小,但这还不够。如何让设计的 UI 可以适配不同的分辨率、宽高比和 DPI?这个组件给出了以下3种适配方法,注意任何一种适配方法都不会改变UI的宽高比和相对定位。

Constant Pixel Size:通过调节 Canvas 像素大小来维持缩放不变。它的意思是不根据屏幕分辨率调整 Canvas 的缩放系数,而是调节 Canvas 的像素大小总是与屏幕保持一致。你可以手动或通过代码调节 Canvas 的缩放系数。这是 UI 系统默认的适配方案。如下图两种分辨率下相同的UI显示的不同之处,虽然不同屏幕下UI元素定位、大小没有发生变化(图中两个白色元素定位分别为屏幕左上角和右下角),但是较小的屏幕上UI元素占用了大部分屏幕空间,显得更拥挤。这就是这种适配方式的缺点,小屏幕太拥挤、大屏幕太空旷,没有考虑到屏幕的分辨率和DPI。但是这种模式的好处是UI元素可以保持设计时的细节(因为没有缩放)。这种模式可能适用于:你希望UI在一定范围内按原始大小显示,这样既可以让UI显示的尽可能清晰、又可以让屏幕较大的玩家拥有更广阔的视野,但是在太小或太大的屏幕上,你可以通过程序来调节缩放系数,不至于小屏幕被UI占满、大屏幕找不到UI。

Scale With Screen Size:根据屏幕分辨率缩放。这可能是大部分游戏最方便的适配方法。在这种模式下,你需要指定一种设计分辨率,然后指定缩放的算法。无论哪种缩放算法,如果实际宽高比与设计宽高比相同,UI 都会被等比缩放。实际上,Canvas 只是保持自己的大小和设计分辨率一致。如果实际宽高比与设计宽高比不同,这时缩放算法才会影响显示结果。缩放算法有三种:扩展、收缩 和 匹配宽高。扩展算法的逻辑是,扩大 Canvas (在宽高比上)较短的一边,使得 Canvas 宽高比与屏幕一致。如下左图,设计分辨率宽高比为1:1(红色线框),实际屏幕更宽所以 Canvas 的 width 增加以匹配屏幕。这样的算法在宽高比不同的屏幕上将始终导致UI更“开阔”。收缩算法的逻辑是,收缩 Canvas (在宽高比上)较长的一边,使得 Canvas 宽高比与屏幕一致。如下中图,设计分辨率宽高比为1:1(红色线框),实际屏幕更窄所以 Canvas 的 height 减小以匹配屏幕。这样的算法在宽高比不同的屏幕上将始终导致UI更“紧凑”。匹配宽高的算法逻辑是,根据指定的权重,同时调节 Canvas 的宽和高,使得 Canvas 宽高比与屏幕一致。如下右图,设计分辨率为红色线框,设定宽度和高度的权重相等(0.5),实际屏幕上 Canvas 的宽和高都被调整以匹配屏幕。这样的算法在宽高比不同的屏幕上根据宽高权重的不同UI布局“保真度”也不同。

Constant Physical Size:通过调节 Canvas 物理大小来维持缩放不变。它的意思是不根据屏幕物理大小调整 Canvas 的 DPI,而是调节 Canvas 的物理大小总是与屏幕保持一致。这种说法可能比 Constant Pixel Size 更难以理解,实际上他们本质是一样的,只不过 Constant Pixel Size 通过逻辑像素大小调节来维持缩放,而 Constant Physical Size 通过物理大小调节来维持缩放。使用这种模式必须指定一个像素转换物理大小的因数(填写96方便在windows上进行开发)。运行时通过具体设备报告的dpi计算最终的 Canvas 像素大小和缩放比例。这种模式从设计的意图来看,是为了适应某些超高dpi的显示设备(比如现在的 mac 高达 5K 的显示器),但是在我看来只不过是让开发人员更加困惑,实际使用价值并不高。因为开发人员更关心设计分辨率,他们需要绘制明确尺寸的图片!除非未来开发人员和玩家都使用了超高dpi的显示器,才会开始忽略像素尺寸而仅专注于物理尺寸。

未完待续。

如果你觉得我的文章有价值,点个“推荐”、加个“关注”什么的我也不会介意的......

【白猫,博客园首页:http://www.cnblogs.com/whitecat/

时间: 2024-08-28 00:08:40

理解和使用 Unity UI 系统的相关文章

全面理解 Unity UI 系统

[狗刨学习网] 随着 Unity 4.6 发布,新 UI 系统终于与大家见面了. RectTransform Unity UI 系统使用 RectTransform 实现基本的布局和层次控制.RectTransform 继承于 Transform,所以 Transform 的所有特征 RectTransform 同样拥有.在 Transform 基础上,RectTransform 增加了 轴心(pivot).锚点(实际上是用 anchorMin.anchorMax 两个点定义的矩形区域).和 尺

Unity3D 4.6 新的UI系统

在Unity3D 4.6版本中,终于增加了新的UI系统.虽然从功能,效果等方面来讲,跟NGUI还有一定的差距,但NGUI毕竟是收费插件,对于游戏商用来说有一定的制约. 下面我们来看看,Unity3D 4.6中新的UI系统吧. 如上图所示,我们可以看到在GameObject菜单中,已将3D Object,2D Object和UI分类了. UI中,我们可以看到Panel,Button,Text,Image,RawImage,Slider,Scrollbar,Toggle,InputField,Can

【Unity编程】Unity动画系统(一)

Unity动画系统 Unity动画系统,也称为"Mecanim",提供了以下功能: 简单的工作流程,设置动画的所有元素,包括对象,角色和属性. 支持导入外部创建的动画片段和使用内置动画编辑器制作的动画片段. 人型动画重新定位,动画角色的运动控制可以被所有的角色模型共享,即角色的外观(SkinedMesh)和运动(Animator)是分离的,它们互相组合之后形成最终的动画. 用于编辑动画状态的的简化工作流程,即动画控制器. 方便预览动画片段,以及片段之间的插值过渡. 这使得动画师可以独立

Unity4.6新UI系统初探(uGUI)

一.引言 Unity终于在即将到来的4.6版本内集成了所见即所得的UI解决方案(视频).事实上从近几个版本开始,Unity就在为这套系统做技术扩展,以保证最终能实现较理想的UI系统.本文试图通过初步的介绍和试用,让读者对这套系统有大体的了解,以便更进一步评估这套UI系统好不好用,适合用在什么项目.为了避免坑挖太深,更进一步的试用和评估我将在<用uGUI开发自定义Toggle Slider控件>中进行论述.为论述方便,下文将这套New UI System简称为uGUI,并且以X-UI指代现有第三

[转]理解低压差稳压器 (LDO) 实现系统优化设计

转]理解低压差稳压器 (LDO) 实现系统优化设计 电子电路 by xfire 低压差稳压器(LDO)看似简单,但可提供重要功能,例如将负载与不干净的电源隔离开来或者构建低噪声电源来为敏感电路供电. 本简短教程介绍了一些常用的 LDO 相关术语,以及一些基本概念,如压差.裕量电压.静态电流.接地电流.关断电流.效率. 直流输入电压和负载调整率.输入电压和负载瞬态响应.电源抑制比(PSRR).输出噪声和精度.同时,为了方便理解,文中采用 了示例和插图. 设计过程中通常到后期才会进行 LDO 选型,

doom3的UI系统

doom3的UI系统是纯数据驱动的,例如 windowDef TextTitle2 { rect 20,341,600,55 visible 1 text "#str_00073" forecolor 0.6,1,1,0 textscale 0.8 font "fonts/micro" textalign 1 notime 1 onTime 0 { transition "forecolor" "1 1 1 0" "

界面UI系统雏形

最近一直在做界面的灵活性,界面UI的设计可以说是一个永不褪色的话题,怎么说呢?首先给用户第一直观感受的肯定是你这款软件的界面设计好坏与否?所以界面UI应该予以重视. 界面UI系统的流程图: 第一步:页面模板,即动态生成页面 为什么需要动态生成页面呢?我们都知道一个JSP页面包括很多的信息,包括HTML表头.系统div块.显示数据的表格.添加/编辑的弹框.而这些都是每一个页面中都需要重复的.如何避免这些重复的代码,减少开发人员的工作量呢?这就引出了动态生成页面,即动态的创建业务页面,不需要手写HT

Unity3D 4.6 新的UI系统啊

在Unity3D 4.6版本中,终于增加了新的UI系统.虽然从功能,效果等方面来讲,跟NGUI还有一定的差距,但NGUI毕竟是收费插件,对于游戏商用来说有一定的制约. 下面我们来看看,Unity3D 4.6中新的UI系统吧. http://travel.tianya.cn/travelPlan/showPlan?planId=8413297 http://travel.tianya.cn/travelPlan/showPlan?planId=8413298 http://travel.tiany

Unity UI大小动态设置(Resize Unity UI RectTransform)

我们在开发过程中发现,要调整Unity UI元素的大小,RectTransform提供了sizeDelta属性可以用来动态修改RectTransform的大小,但同时我们也google到另外一个修改RectTransform大小的方法,方法如下: 1 public static void SetRectTransformSize(RectTransform trans, Vector2 newSize) 2 { 3 Vector2 oldSize = trans.rect.size; 4 Vec