Unity UI -- (3)管理屏幕大小和锚点

news2024/11/19 0:43:51

        在前面我们探索了一些基本的文本格式。我们需要考虑一个问题,这个文本在屏幕大小发生变化时该如何适应呢?

        在Unity中,我们可以使用Canvas和Anchor Point(锚点)系统来确保UI元素总是出现在正确的位置,不管它们在哪种屏幕上出现。

修改Editor布局方便UI相关工作

        在编辑修改UI的时候,让场景视图和游戏视图同时都能看到是非常有帮助的。

        1. 重新安排一下Unity Ediotr的布局,让场景视图和游戏视图堆叠到一起。在Layout选择器里,使用2 by 3选项可以达到此目的,当然我们也可以自定义布局,最终期望的效果类似下图:

        2. 在Hierarchy中,双击Canvas游戏物体,在场景视图中框住它。现在的透视视图会变成3D场景在Canvas的左下角位置,变得很小,屏幕主要显示的是一个巨大的2D矩形。

        如果我们没有看到矩形的边框,可能需要再场景视图里启用Gizmos。

        这个矩形Canvas表示了项目最终要显示到的屏幕,所有UI元素必须在矩形内才能在屏幕上被看到。

        3. 在场景视图中,启用2D模式。

        由于Canvas是二维平面的,因此2D模式是最方便的编辑方式,2D模式会限制元素只在X和Y轴上移动。要退出2D模式,再点一次2D按钮即可。

选择长宽比(aspect ratio)

什么是长宽比?

        我们现在实际已经知道了屏幕的轮廓(Canvas),接下来我们设置一下屏幕的形状,或者叫做长宽比(aspect ratio)。

        长宽比描述了屏幕的宽度和高度的关系。举个例子,老电视机使用4:3长宽比,意思是屏幕有4个单位的宽度和3个单位的高度。宽屏电视使用16:9长宽比,意思是一样的。

锁定项目的长宽比

        Unity允许我们选择Canvas所使用的长宽比。

        1. 在游戏视图中,使用屏幕分辨率下拉菜单,选择Free Aspect。

        Free Aspect意思是屏幕可以自由地改变长宽比。当Free Aspect被启用时,Canvas会我们改变游戏视图窗口的时候改变它的形状和大小。如果我们想要确保场景在不同形状的屏幕上看起来都OK,使用Free Aspect非常有帮助。

        2. 移动游戏视图窗口的边界,让其变得更宽或更窄。我们会注意到场景视图里的Canvas会自适应游戏视图窗口的大小和形状改变。 

        在改变窗口过程中,我们也可以看到文本会跳出屏幕外,从这点可以看出UI要能正确响应不同的屏幕有多困难。简单起见,我们将长宽比设置为一个固定值。 

        3. 在游戏视图中,使用屏幕分辨率下拉菜单,选择16:9或16:10长宽比。

            16:9是标准的宽屏比,因此是最安全的选项。为一个可预期的长宽比做UI设计会让工作简单不少。使用一个固定的长宽比,我们会注意到游戏视图窗口的变化并不会影响场景视图里的Canvas的长宽比。

添加设置按钮到屏幕某个角落

        1. 在Hierarchy中,点击右键,选择UI > Button - TextMeshPro。Canvas上会出现一个按钮,它是Canvas游戏物体的一个子物体。

         2. 在Hierarchy中,重命名"Button"为“Settings Button”。

        3. 展开Settings Button游戏物体,选择Text(TMP)子游戏物体。这是一个TextMeshPro元素,和之前的标题文本所用的UI元素一样。将它的文本改成“Settings”,编辑一下文字的风格大小等。

        4. 使用移动工具,将按钮放到Canvas的某个角落,在按钮和屏幕边界之间保留一定的空间。选择哪个地方,按照自己的场景情况和喜好进行选择即可。

什么是Anchor?

 为何我们需要锚点?

        现在我们已经将设置按钮放到了屏幕的某个角落了。

        一切看起来似乎很美好,但如果我们移动游戏视图窗口的边界,增加或减少屏幕的大小,按钮会飘到我们不想要的位置上去。

        如果屏幕太小,按钮会飘出屏幕外。

         如果屏幕太大,按钮则会靠近中心位置。

        Canvas的锚点系统控制着这种移动。每个Canvas上的UI元素都锚定到了其父物体上的一个特定的位置,当屏幕大小改变时它会相对于这个位置移动。

锚点可视化

        在场景视图的工具栏中,选择Rect工具(或在场景视图中按键盘的T键),然后选择设置按钮游戏物体。

        Rect工具选中时,我们能卡到按钮的Rect Transform的四个角,这四个角以蓝色圆点表示。我们还可以看到锚点处于屏幕中心,由四个指向内部的小三角形 组成。

        注:上图中为了演示锚点,关闭了标题的TextMeshPro物体和天空盒。

        按钮总是会保持和锚点的距离,无论屏幕有多大或多小。我们可以通过修改游戏视图窗口的大小来验证一下。

        下图是游戏视图窗口非常小的时候,设置按钮相对于屏幕中心的位置,按钮会跑到屏幕外。

        下图是游戏视图窗口正常大小的时候,设置按钮相对于屏幕中心的位置,按钮处于右上角。

        下图是游戏视图窗口非常大的时候,设置按钮相对于屏幕中心的位置,按钮靠近屏幕中心。

        每一个按钮的四个角的蓝色小圆点,对应锚点的四个小三角。

        我们可以单独地控制锚点的四个角,但目前我们不需要这样做。

为按钮设置锚点

        将标题的锚点放到屏幕中心可能没什么问题,因为标题就应该停留在靠近屏幕中心的位置。但对于设置按钮来说,它应该在屏幕的角落里。因此它应该被锚定在屏幕的角落上。

        1. 保持设置按钮选中状态,鼠标选择锚点的中心位置,然后将它移动到最靠近按钮的角落位置。要小心不要只点中锚点的某一个单独的小三角,而是直接在锚点中心点击它做整体移动。

        2. 尝试调整游戏视图窗口的大小。现在按钮应该会和屏幕的某个角落的位置保持不变。

            为了节省我们的时间精力,Unity中有一些预设的锚点设置供我们使用。

        3. 保持设置按钮物体被选中,在Rect Transform组件中,选择Anchor Preset图标。

            这样会打开预设锚点面板:

        4. 尝试选择一下不同的预设锚点位置,注意看锚点在场景视图中的位置变化。可以修改一下游戏视图窗口的大小来看看实际效果,最后选择一种最适合你的情况即可。

什么是支点(pivot point)?

        我们在Anchor Presets菜单顶部,会看到一个Shift:Aslo set pivot。

        当设置一个预设锚点的同时按住Shit键时,我们会同时改变物体的支点(pivot point)。

        下图中的空心圆圈就是物体的支点,物体的位置移动、旋转和缩放等,都会以这个支点为参考。当我们的UI元素没有按照预期行为动作时,支点也是一个我们需要关注的点。

        关于支点、锚点的更多细节信息,可以参考Unity官方文档:
Basic Layout | Unity UI | 1.0.0https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/UIBasicLayout.html

探索:实验Canvas缩放

        在设计UI的时候,我们可能会注意到当我们缩放游戏视图窗口分辨率变大变小的时候,UI元素占据屏幕的比例大小会有所不同。

        在更高分辨率下,UI看起来占比更小;在更低分辨率下,UI看起来占比更大。

        这和Canvas Scaler有关系,Canvas Scaler是一个控制UI元素在不同屏幕大小中的缩放和分辨率的组件。 

        1. 选中Canvas游戏物体,定位到Canvas Sclaer组件。注意UI Scale Mode属性默认被设置为了Constant Pixel Size。

            当使用constant pixel size时,无论屏幕的总大小是多少,UI元素总是使用相同的像素个数。在某些情况下,这会比较有用,比如我们想要在非常低分辨率设备上用户也能看清我们的文字的时候。

        2. 设置UI Scale Mode为Scale with Screen Size。这个模式会根据屏幕分辨率按照比例缩放UI元素。UI元素会占据相同的比例。

            默认情况下,Canvas Scaler会匹配屏幕的宽度,使用800x600为参考分辨率。

        3. 增加或减少参考分辨率的X(width)会让我们的UI元素适应到我们所用屏幕的最佳相对大小。

            每种UI Scale模式都有其优点:

            Scale with Screen Size会保证所有UI元素无论屏幕大小,都能被放到相同的相对位置上。

            Constant Pixel Size会确保UI元素总是有相同的像素个数。

            Constant Physical Size会让UI元素占据相同的物理大小,这是因为它也考虑了设备的DPI(dots per inch)。

        4. 选择Constant Pixel Size或Scale with Screen Size中的一种作为你的项目的UI Scale Mode。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arduino ESP32的串口

Arduino的ESP32的三个串口 ESP32的三个串口 在Arduino的核心中有三个串口,分别是Serial,Serial1,和Serial2. 当然ESP32也可以使用软串口。但硬件串口更稳健(我这样理解)。但Serial1这个串口不能使用,因为…

腾讯云轻量应用服务器公网带宽速度如何?

腾讯云轻量应用服务器网速怎么样?轻量应用公网IP带宽速度与地域有关,中国大陆地域如北京、上海、广州等地域采用多线BGP网络,保障轻量应用服务器的速度,中国香港国际CN2高速网络。中国内地的地域大家是完全不用担心,大…

Eureka实战入门

spring cloud的版本 spring cloud的版本是根据springboot版本确定的 Spring Cloud Dalston, Edgware, Finchley, and Greenwich 版本不再更新了 版本 SNAPSHOT:开发版本,最新版本 Milestone:大版本在发布前的里程碑的版本 Release candi…

usb摄像头驱动-core层hub.c

usb摄像头驱动-core层hub.c 文章目录 usb摄像头驱动-core层hub.cusb_hub_inithub_probehub_eventport_eventhub_port_connect_changehub_port_connectusb_new_deviceannounce_device 在USB摄像头驱动中,hub.c文件扮演着USB集线器(Hub)驱动的角…

<数据结构>顺序表和链表的比较|缓存命中率

💭前言:通过之前对顺序表和链表的实现,我们可以发现在增删查改某些操作上两者的效率前言有所差异,本篇文章将总结二者的异同。 顺序表的实现http://t.csdn.cn/Lxyg2单链表的实现http://t.csdn.cn/rHgjG双链表的实现http://t.csdn.…

国考省考行测:现期比重,基期比重

国考省考行测: 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇到寒冬&am…

【c++】位图与布隆过滤器

一.位图 1.位图的概念 给 40 亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这 40 亿个数中。【腾讯】 刚开始许多同学能想到的方法有: 1. 遍历,时间复杂度 O(N) 2. 排序 (O(NlogN)) &#x…

分代回收工作流程

GC回收算法之分代回收 GC回收垃圾主要有三个算法,分别是标记清除,复制算法以及标记整理。 三种算法各有优缺点,其中标记清除的优点就是简单高效,缺点就是很容易带来内存碎片化问题。 复制算法的话,优点确实解决了内存碎…

springcloud-alibaba (02)nacos学习笔记

nacos 一,介绍1. 什么是Spring Cloud Alibaba Nacos2. Nacos的特点和优势 二,安装和配置三,创建项目第一步,创建父工程第二步,创建基础公共模块第三步,创建服务模块第四步,开启多个实例 四&…

用Python进行AB测试之T检验的案例学习【文末源码地址】

文章目录 案例背景假设检验解读一、提出假设二、检验统计量三、代码实现四、结论 源码地址 案例背景 产品经理对APP做了许多改动,想要通过AB测试评估一下改动后的效果如何? 其中有一项评估是:签到按钮从蓝色改为红色后,客户点击…

Java 成员变量与局部变量有什么区别?

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符…

Smart HTML Elements Crack

Smart HTML Elements Crack Smart HTML Elements是一个现代的Vanilla JS和ES6库以及下一代前端框架。企业级Web组件包括可访问性功能(WAI-ARIA,第508/WTAG法规遵从性)、本地化、从右到左键盘导航和主题化。与Angular、ReactJS、Vue.js、Bootstrap、Meteor和任何其他…

vue编写组件 根据指定日期获取一周内所有 日期与农历日期展示 并标记当天

首先 我们要引入一下对应的第三方依赖 npm install --save chinese-lunar-calendar sass sass-loader这里 我们需要 chinese-lunar-calendar 将日期变成农历日期的工具 sass是因为 我这里为了方便 用了 sass写样式 组件代码如下 <template><headerclass "ske…

学习自动化这3个坏习惯要你命,90%测试人躺枪!

将自动化测试当成很了不起的资本&#xff0c;源于国内对Coding的崇拜 盲目的学习自动化&#xff0c;不光对你的工作没有帮助&#xff0c;可能对你的测试之路还会起反作用&#xff01; 1,为什么说盲目学习自动化可能会让你一无是处&#xff1f; 没有全面理解软件测试的基本原理…

让自己再认识一下分区吧

在上个博客中&#xff0c;我们讨论了复制 —— 即数据在不同节点上的副本&#xff0c;对于非常大的数据集&#xff0c;或非常高的吞吐量&#xff0c;仅仅进行复制是不够的&#xff1a;我们需要将数据进行 分区&#xff08;partitions&#xff09;&#xff0c;也称为 分片&#…

【Proteus仿真】| 51单片机——MAX7219 驱动数码管

系列文章 todo: 文章目录 前言1. 简单了解MAX72191.1 引脚说明1.2 寄存器说明1.2.1 选位寄存器1.2.2 BCD译码器设置寄存器1.2.3 亮度寄存器1.2.4 扫描限制寄存器1.2.5 显示测试寄存器1.2.6 关停寄存器 1.3 spi总线通信时序1.4 数据格式 2. 使用MAX7219驱动数码管2.1 驱动数码管…

【2023/05/18】TPU

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第13天。 Share The waterfall sings,"I find my song,when I find my freedom." 译文&#xff1a; 瀑布歌唱到&#xff1a;“我得到自由时便有了歌声。” I cannot tell why this heart la…

精彩直击 | 迅镭激光参展CIBF2023年电池技术盛会

5月16日&#xff0c;全球规模最大的电池、能源行业盛会——CIBF2023第十五届中国国际电池技术展览会(以下简称2023CIBF电池展)&#xff0c;在深圳国际会展中心(宝安新馆)隆重开幕! 迅镭激光携一系列新能源自动化解决方案亮相9T263展位&#xff0c;与客户分享创新技术及自动化产…

【Jmeter第四章】Jmeter添加断言(捕捉自定义错误信息)

文章目录 1、断言介绍2、Jmeter使用断言3、效果展示 1、断言介绍 前言&#xff1a;关于Jmeter中的断言&#xff0c;其实可以理解为对返回信息&#xff0c;返回代码的一种处理&#xff0c; 因为对应HTTP状态200而言&#xff0c;但我们会定义不同的返回值&#xff0c;例如 code…

【数据结构<顺序表>】C语言

前言 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条…