UGUI相关知识点

画布的三种渲染模式
1.Overlay:覆盖模式,UI永远处于最上方,UI的屏幕坐标等于世界坐标
2.Camera:摄像机模式,需要选择让UI在指定摄像机上渲染,世界物体可以覆盖UI
3.WorldSpace: UI作为世界物体出现,不受摄像机的影响,并且画布可以拖动
三种模式区别:Overlay的画布永远不会变化,控制简单
Camera模式中画布会跟着摄像机移动,如果需要某个物体覆盖UI,可以使用Camera模式
WorldSpace模式中画布不需要移动,画布对UI没什么影响,UI可以超过画布范围,用于制作3D UI
难点RectTransform组件中的各种属性说明
在这里插入图片描述

从下往上:
Pivot表示UI的中心点,0, 0为中心点在UI的左下角,1,1表示UI的最右上角
Anchors表示锚点,锚点总共有4个点:
Min x, Min y 表示左下角的锚点
Max x, Max y表示右上角的锚点
Min x, Max y表示左上角锚点
Max x, Min y表示右下角锚点
Anchors 是相对于父物体的,不会超出父物体,0, 0表示父物体左下角,1,1表示父物体右上角
Pos x, Pos y表示UI的中心点距离锚点的距离,UI中不使用Z轴
锚点的本质:以image为例,image的4个脚,分别固定了锚点的4个点,两者的距离不会发生改变
注意:Pos不是UI离屏幕左下角原点的距离,只有当锚点在屏幕左下角时,才是离屏幕原点的距离
锚点的设置:
在这里插入图片描述
直接按,表示只设置锚点位置
按下Shift,表示同时设置锚点和中心点的位置,如果锚点在左,那么中心点也在左
按下Alt,表示同时设置锚点和UI自身的位置,如果锚点在左,那么UI也在左
按下Shift+Alt,表示同时设置锚点的位置、中心点位置和UI自身的位置
Text的各种属性
在这里插入图片描述
默认情况下:文本内容可以超出Text框,如果超出了Text框,则不显示
Horizontal Overflow:表示水平溢出,水平不受Text框的影响
Vertical Overflow:表示垂直溢出,垂直方向不受Text框的影响
Best Fit:最佳匹配,字体不会溢出框,而且输入的文本会根据用户的输入自动调整,如果用户没有手动换行,则它会一直显示在一行中,并自动调整字体至水平填满Text框,用户按下回车后,文本内容也会自动换行

rect.sizeDelta:表示 UI的大小-锚点间距
sizeDelta.x:相当于宽度-左右锚点的间距
如果锚点没分开时,那么锚点间距为0,所以sizeDelta就是UI的大小,如果分开了,那么sizeDelta就不是UI的大小了



UGUI的事件系统

EventSystem基于InputMudule和Raycaster,不只适用于2DUI,如果让3DCamera添加上PhysicsRaycaster组件后,3D物体就可以使用EvenySystem的事件了(原理同Canvas上都挂有GraphicRaycaster)

EventSystem

1.eventSystem.RaycastAll可以获取到当前PointerEventData指示的坐标下的所有对象
2.一个场景中,应该只有一个eventSystem对象



画布分辨率原理

在这里插入图片描述

在CanvasScaler选择为ScaleWithScreenSize下,如果Match为0,即匹配宽度,会将画布RectTransform的width锁定在设定的匹配宽度下(即800),但是画布的宽度变了,又不能超出摄像机的范围,于是需要将自身的Scale进行缩放,至画布长宽与摄像机尺寸匹配。假如摄像机的size为1,为2unit,相当于有2个Cube的高度,那么实际上画布的宽度也是2unit,只是因为缩放导致的宽度显示为800。

画布分辨率计算

如果优先匹配宽度,那么会以宽度为基准,设置为目标值(800), 那么高度要怎么来呢,画布长宽需要与屏幕的分辨率保持宽高比一致。这里需要设个方程,即在这里插入图片描述
解出得画布高度 x 约为450。

结论:分辨率的适配即是宽高比的适配

Unity单位可以和ui像素做转换

首先需要先保持ui的锚点跟世界0点位置一致,这样不产生偏移量方便计算
我们知道1size=2unit,那么当相机size=20时,由于相机范围就是画布的范围,则画布高度为40unit,再由画布分辨率高度,假定为1260(像素),那么
1unit = 1260 / 40 = 31.5像素
这样就实现了ui的像素跟unit的转换
顺便一提,如果是2D Sprite,那么默认就是1unit=100像素,不用计算转换

相机长宽计算

相机在正交模式下,即Orth…模式下
默认情况下,摄像机的高度是由Size决定的,而宽度是根据屏幕长宽比来适应的,根据屏幕分辨率算出长宽比,之后再用摄像机高度乘上这个比值,就知道宽度多少了,比如下面的,假设摄像机高度是2unit:
在这里插入图片描述
解得X约为3.555unit
另一种情况,当摄像机设置了RenderTexture时,摄像机的宽度则是由RenderTexture的长宽比值决定的,计算方法同上

画布Scale计算

我们假定摄像机Size是5,并且画布匹配分辨率为800*600,由上面的计算原理可得出摄像机实际宽度约为 1920/1080 * 5size * 2 =17.777unit。
又由于画布的长必须要为800,以及画布的实际长度是17.777unit(画布长度跟摄像机长度一致),那么可得 800 * x = 17.777,解得x,即scale=0.02222125

Horizontal / Vertical Layout Group 相关属性

下面都以Horizontal为例
Padding:内边距,例如Left = 100, Top = 50, 则显示如下
在这里插入图片描述

Spacing:每个子物体之间的间距,如果是Horizontal,则表示左右间距;Vertical则表示上下间距

Control Child Size:控制子物体的大小,可勾选Width/Height,以下都以Width为例。
如果勾选了Width,则子物体宽度会受到父物体影响,且不同组件会有不同的效果。如下:
当父物体的宽度>子物体的宽度时:
1.Image:如果image设置了sprite,则宽度强制设定为sprite原宽度;如果没有设置sprite,则为0
2.Text:Text将会根据文本内容自动调整宽度。没有输入文本时,则为0
当父物体的宽度<子物体的宽度时:
1.Image:宽度跟父物体保持一致
2.Text:宽度跟父物体保持一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值