1.Canvas

三种渲染模式:

ScreenSpace - Overlay,ScreenSpace - Camera,WorldSpace。每种渲染模式针对不同的场景及应用

ScreenSpace - Overlay:直接贴在屏幕的最上面,不会因为相机的移动或者变换而变化,常用来制作游戏中背包和血条面板。

ScreenSpace - Camera:UI同样贴在平面上,但是会受到相机来渲染。也就是会受到相机距离来影响,但是需要指定一个 Camera,UI 会根据摄像机来显示,可以控制 UI 与摄像机的距离、排序、层级

WorldSpace:UI 变成 3D 世界里的 “平面物体”,随相机视角变化,用于场景内的 UI。这时候 Canvas 不再是“贴屏幕”,而是像一块广告牌、显示器、按钮面板一样,真的放进 3D 世界中。Canvas 有真实的位置、旋转、缩放,会受场景透视影响,可以被别的 3D 物体遮挡,玩家走近看会变大,走远看会变小

Overlay模式并不与空间上排序有任何关系,空间上的前后位置不再对元素起作用,它常用在纯UI的区域内,这种模式下Camera排序有别与其他模式,Sortorder参数在排序时被着重使用到,Sortorder参数的值越大,越靠前渲染。在这个模式下没有Camera的渲染机制因此很难加入普通的3D模型物体来增加效果。

ScreenCamera模式,相对比较通用一点,它依赖于Camera的平面透视,渲染时的布局依赖于它绑定的Camera。想让更多的非UGUI元素加入到UI中ScreenCamera模式更加具有优势。这种模式是实际项目中制作UI最常用的模式,不过UGUI底层有对排序做些规则,如对元素的z轴不为O的元素,会单独提取出来渲染,不参与合并。

WorldSpace模式,主要用于当UI物体放在3D世界中时用的,比如,一个大的场景中,需要将一张标志图放在一个石块头上,这时就需要WorldSpace模式。它与ScreenCamera的区别是,它常在世界空间中与普通3D物体一同展示,依赖于截锥体透视(Perspective)Camera。它的原理挺简单的,与普通物体一样当UI物体在这个Camera视野中时,就相当于渲染了一个普通的3D面片,只不过除了普通的渲染Canvas还对这些场景里的UI进行合并处理。*

CanvasScaler:

它的核心作用就是让你的 UI 在不同分辨率 / 屏幕尺寸下,能 “适配” 显示,不会出现手机上按钮挤成一团、电脑上 UI 小得看不清的情况。

它也有三种UI缩放模式:

Constant Pixel Size(恒定像素大小):不会根据屏幕分辨率的变化而变化,如:你在纸上画了一个 50x50 像素的按钮,把这张纸贴到手机屏幕(1080P)上,按钮大小刚好;但贴到电脑屏幕(4K)上,按钮就会显得特别小(因为 4K 屏幕像素更密)

Scale With Screen Size(随屏幕尺寸缩放):先定一个 “参考分辨率”(比如 1080x1920,手机主流分辨率),然后让 Canvas 根据当前屏幕和参考分辨率的比例,自动缩放整个 UI—— 保证 UI 在不同屏幕上的 “视觉大小” 基本一致。(等比例进行缩放)

**Constant Physical Size(恒定物理大小)**UI 元素的大小按 “物理尺寸”(厘米 / 英寸)定义,不管屏幕分辨率 / 尺寸如何,UI 的实际物理大小不变 —— 比如你定义按钮是 1 厘米宽,那在手机、平板、电脑屏幕上,按钮的物理宽度都是 1 厘米(也就是按照物理大小恒定

Constant Pixel Size:像素固定,分辨率变 UI 大小视觉上变;

Scale With Screen Size:参考分辨率缩放,跨屏幕视觉大小不变;

Constant Physical Size:物理尺寸固定,不管屏幕多大 UI 实际尺寸不变。

Graphic RayCaster(图形射线检测):

作用是让 Unity 能检测 “射线” 是否击中 Canvas 里的 UI 元素(按钮、文本、图片等)。理解成:给 UI 加了 “可被点击 / 触摸识别” 的能力。

Unity 的 UI 交互(点击、拖拽)本质是 “射线检测”—— 当你点击屏幕时,Unity 会从点击位置发射一条 “看不见的射线”,Graphic Raycaster 就是负责让这条射线能 “碰到” UI,并告诉程序 “用户点到了哪个 UI”。

该组件工作的前提:

是Graphic Raycaster 必须挂载在有 UI 的 Canvas 上(和 Canvas 的渲染模式无关);

被点击的 UI 元素(比如按钮)必须有 Graphic 组件(Image、Text、RawImage 等,这是 “可被射线检测” 的基础);

UI 元素的 Raycast Target(射线检测目标) 属性必须勾选(默认勾选,关掉就点不到了);

必须有 EventSystem 组件(场景里默认会带,负责管理所有 UI 交互事件)。

参数 通俗解释
Ignore Reversed Graphics 忽略 “反向” 的 UI(比如 3D 世界里的 UI,相机从背面看时,点不到)
Blocking Objects 哪些物体能 “挡住” UI 射线(比如 3D 物体挡住 WorldSpace 的 UI,就点不到 UI 了)
Blocking Mask 只让指定图层的物体挡住 UI 射线(精准控制遮挡规则)

不同 Canvas 模式下的表现

(1)ScreenSpace - Overlay/Camera 模式:射线是从屏幕点击位置垂直发射,只检测 Canvas 里的 UI,和 3D 世界无关(除非你设置了 Blocking Objects)。

→ 比如你点屏幕上的按钮,不管 3D 场景里有什么,只要按钮没被其他 UI 挡住,就能点到。

(2)WorldSpace 模式:射线是从相机发射到点击位置的 3D 射线,UI 是 3D 世界里的 “平面”,所以:

  • 如果有 3D 物体挡在相机和 UI 之间,射线会先击中 3D 物体,UI 就点不到了;

  • 只有射线先击中 UI,才能触发交互。

    → 比如游戏里的 3D 广告牌 UI,被墙挡住后,你点屏幕对应位置,只会点到墙,点不到广告牌。