一:Canvas:渲染UI

Unity中的UI相关组件_实现原理

——Overlay:覆盖模式
类似于手机贴膜,所有UI都会显示在场景中2D,3D物体的上层
在同一个Canvas下可以调整Canvas子物体的先后顺序,层级面板中越靠上则先被渲染
多个Canvas下可以调整Canvas组件的Sort Order属性调整渲染顺序
Unity中的UI相关组件_unity_02

——Camera:相机模式
Canvas只会在指定相机下被渲染
在这种模式下Canvas的x轴和y轴坐标就是指定Camera的x和y坐标,z轴坐标是指定Camera的z坐标+Canvas组件的Z坐标(
Plane Distance属性数值)
这种模式下的渲染顺序作用大小:Camera的Depth>Sorting Layer>Order in Layer>Plane Distance

——World Space:世界空间模式
前两种模式的Rect Transform都是不可修改的,而世界空间模式可以自定义Rect Transform的数值,常用于人物血条的显示
画布和世界空间的比例是100:1,使用世界空间模式时一般将Canvas的Scale设置为0.01,就和世界空间的比例一致了


二:Canvas Scaler:UI适配

Unity单位与像素之间的关系:首先根据每个图片导入设置中的Pixels Per Unit(每个Unity单位代表多少个像素)计算出当前图片代表多少个Unity单位,例如一张分辨率是200*200的图片,Pixels Per Unit设置为100,则这张图片的长和宽都代表2个Unity单位,再根据Canvas Scaler组件的Reference Pixels Per Unit属性(每个Unity单位代表多少个像素)计算出真实渲染在Canvas上的分辨率

——Constant Pixel Size:固定像素模式
Unity中的UI相关组件_unity_03
在此模式下,无论屏幕分辨率尺寸大小怎么变化,UI像素保持不变,想要实现不同分辨率下的适配需要调整Scale Factor数值(Scale With Screen Size的实现原理)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public enum ConstantPixelScalerType
{
    Width,
    Height,
}

public class ConstantPixelScaler : MonoBehaviour
{
    CanvasScaler canvasScaler;

    public ConstantPixelScalerType type;

    public float rawWidth;
    public float rawHeight;

    private void Awake()
    {
        canvasScaler = GetComponent<CanvasScaler>();
        canvasScaler.scaleFactor = type == ConstantPixelScalerType.Width ? Screen.width / rawWidth : Screen.height / rawHeight;
    }
}

——Scale With Screen Size:根据屏幕分辨率适配(最常用的适配方式)
Unity中的UI相关组件_3d_04
此模式的实现原理其实就是调整Scale Facto的值
一般横版游戏Match设置为1,根据Height适配,也就是屏幕宽度对UI元素大小没影响
竖版游戏Match设置为0,根据Width适配,也就是屏幕高度对UI元素大小没影响

——Constant Physical Size:固定物理模式
Unity中的UI相关组件_实现原理_05
基本不常用


三:Graphic Raycaster:UI射线检测

Unity中的UI相关组件_unity_06
这个组件用于UI元素的交互,一个Canvas下的UI元素想要响应射线检测必须在Canvas上挂在此组件
Ignore Reversed Graphics:是否忽略反转图像,图片旋转180度后是否还可以响应射线
Blocking Objects和Blocking Mask:射线检测可以被哪些类型的碰撞器所阻挡(Overlay渲染模式下无效)


四:Canvas Group:UI统一管理

Unity中的UI相关组件_unity_07
Canvas Group的作用是该元素下的所有元素,包括当前元素
例如想修改一个元素下的所有元素的透明度,可以在最父物体上挂载一个Canvas Group组件并控制Alpha值,而不用遍历所有元素
Alpha:透明度
Interactable:是否可以交互
Blocks Raycasts:是否可以接受射线检测
Ignore Parent Groups:是否忽略父物体的Canvas Group影响


五:Content Size Fitter:内容适配

Unity中的UI相关组件_3d_08
常用用文本框或滑动列表的自动适配
Horizontal Fit:水平适配(一般选Perferred Size)
Vertical Fit:垂直适配(一般选Perferred Size)