Unity学习之UGUI自适应个人理解分享

时间:2024-03-15 08:43:58

大家多少应该都遇到过,做好的游戏,打包出来之后,UI元素的位置全都乱了。出现这种情况的原因是,大家在进行UI元素的摆放时没有考虑好在不同分辨率下,UI元素的位置变动,没有对他们的锚点进行针对性的修改调整。
下面我举几个例子来说明如何利用锚点的设置来自适应UI元素的位置
首先创建一个空的2D场景,假如我们开发的手机端的游戏,我将尺寸自定义为1280*800
Unity学习之UGUI自适应个人理解分享
然后我们创建一个Canvas
Unity学习之UGUI自适应个人理解分享
这里有一个RenderMode(渲染模式)可以进行选择,一共有三种模式
一、Overlay:这种模式下,所以Canvas的内容会显示在最前面,你可以理解为在摄像机前面加了一个滤镜,并且永远显示在最前面,而且Canvas里面的内容按照比例映射到摄像机视野上的,因为这种模式的Canvas非常大,你的摄像机的视野在这里(箭头)。
Unity学习之UGUI自适应个人理解分享
二、Camera:这种模式下,可以理解为是在摄像机前面放了一东西,距离你自己可以控制,你也可以在他和摄像机之间加东西,不像Overlay,Camera模式是会被遮挡的,并且这里需要指定一个摄像机。Canvas的大小会和你指定摄像机的大小一致,这样你调整UI元素的布局时会比观。
Unity学习之UGUI自适应个人理解分享
Unity学习之UGUI自适应个人理解分享
这里指出了摄像机和Canvas的空间位置的关系,你在他们中间放置内容就会遮挡Canvas的内容,这里他们之间的距离时100,可以通过PlaneDistance来调整他们之间的距离

三、World Space:这个一般是用于3D游戏的,这里不多介绍

下面先来说说正题UI元素位置的自适应(其实上面说的和自适应关系不大。。。)

这里我选择的是Camera的模式,首先我在这里创建了几个文本,按照下面的位置摆放
Unity学习之UGUI自适应个人理解分享
现在我的分辨率没有改变是 1280800 上面的文本按照行,分成3组,这三组的锚点分别是
Unity学习之UGUI自适应个人理解分享Unity学习之UGUI自适应个人理解分享Unity学习之UGUI自适应个人理解分享
这个时候我们来改变分辨率从1280
800改成25601440看看会发生什么
Unity学习之UGUI自适应个人理解分享
好像除了最后一组锚点设置为 left 的其他的横向位置都发生了变化,这是为什么呢
Unity学习之UGUI自适应个人理解分享
原因在这里,Canvas Scaler的设置,先解释一下每个设置是做什么。
UI Scale Mode:如何缩放画布中的UI元素
一共有三个选项: Constant Pixel Size、 Scale With Screen Size、 Constant Physical Size
1.Constant Pixel Size:无论屏幕大小如何,UI元素都保持相同的元素大小,选择这个模式后Canvas的大小会随分辨率的大小进行变化,这个模式不适合做自适应,因为这个Canvas里面的元素大小和位置是固定,当你改变分辨率的时候,就像是更换了参照系。
这是将UI Scale Mode改成Constant Pixel Size的样子,因为每个元素都有自己的位置信息,并且并且不会改变,所以当你把改变了宽度和高度后,他们用的还是原来的位置信息,所以就会出现下面的情况
Unity学习之UGUI自适应个人理解分享
2.Constant Physical Size:无论屏幕大小和分辨率如何,UI元素都保持相同的物理大小,这个模式也不适合做自适应,大家试一下就知道了,
3.Scale With Screen Size:缩放跟随屏幕尺寸,看名字这个就很靠谱的样子,这个就是我们做自适应最合适的模式,Unity官方手册的解释是这样的:使UI元素的大小随分辨率大小改变,
Unity学习之UGUI自适应个人理解分享
其实这个说法,是对的但是也不对,因为你会发现,你改变分辨率的时候canvas和UI元素的大小在并不是都改变了,当分辨率变成2560
1440时你会发现Canvas的大小变了,但是好像不是一样的。我们先来看Scale With Screen Size模式下的参数
Unity学习之UGUI自适应个人理解分享
Unity学习之UGUI自适应个人理解分享
Reference Resolution(参考分辨率):UI布局设计的分辨率,如果屏幕分辨率大于他,则UI按照比例放大。反之相同。这里的分辨率就设置成你制作游戏时的分辨率
Screen Match Mode(屏幕匹配模式): 有 Match Width or Height、Expand、Shrink三种
这里主要介绍Match Width or Height,缩放画布大小,以宽或者高为参考,或者介于两者之间。什么意思呢?例如如果分辨率从1280800改成25601440,
如果是以高为参考,那么Canvas的大小实际会变成 高还是800,但是 宽=2560/(1440/800)等于1422.2222…就是大家上面看到的大小,
如果是以宽为参考,那么Canvas的大小实际会变成 宽还是1280,但是 高=/1440(2560/1280)等于 720
这里大家应该清楚了,这里的自适应改的只是比例,并不是大小。那么怎么设置以高还是宽为参考呢。通过
Match 的值最左是以宽为参考,最右边是以高为参考,中间值就是按比例宽和高都考虑一下。

了解到这里,你发现当不管在什么设备上运行时,你总是可以保持宽或者高和你的开发尺寸相同时,你就可以使用锚点工具来控制你的元素的位置,让他们不管在什么设备上都显示在相同的位置。

还是回到第一个例子,为什么只有锚点设置为left的横向位置没有变化,因为设置了锚点之后,在宽变化之后锚点在Canvas的位置就变化了,但元素和锚点之间的位置时固定的,所以当宽变长了之后,只有锚点在最左边,0位置的元素位置没变,中间和右边锚点的元素位置都变了,因为屏幕宽了,中间值和右边最大值都变了。
所以当我把Match的值设为以宽为参考的时候,还是在2560*1440,分辨率下,文字的位置就正常了。因为Canvas的宽没有变,那么元素横向位置自然不会变。

Unity学习之UGUI自适应个人理解分享Unity学习之UGUI自适应个人理解分享
这就是锚点的设置和Canvas Scaler的设置配合起来的作用。大家可以更具自己的项目需求进行设置以满足自己的需求。
谢谢大家观看,分享让知识变得有意义!后续会继续更新一些我在学习中遇到的有趣的问题。
OJMars
InTheMars