当前位置: 首页 > news >正文

【Unity UGUI Canvas(画布)(1)】

Unity UGUI 中Canvas组件三种渲染模式

引言

在 Unity UGUI 系统中,Canvas(画布) 是所有 UI 元素渲染的基石与容器。任何 UGUI 控件(如按钮、文本、滑块)都必须直接或间接地位于某个 Canvas 之下方能显示。Canvas 的核心职责是管理 UI 元素的渲染顺序、处理屏幕坐标转换,并最终决定 UI 以何种方式呈现在玩家面前。
官方手册是很好学习资料,这里贴参考画布组件介绍、设计多种分辨率的UI

壹—— Cnavas UI 元素渲染的基石与容器

Unity 为 Canvas 提供了三种不同的渲染模式(Render Mode),以适应从传统 2D 界面到沉浸式 3D 应用的不同需求。理解这三种模式的工作原理和适用场景,是构建高效、美观 UI 的关键。

Canvas渲染模式对比

一、屏幕空间 - 覆盖 (Screen Space - Overlay)

屏幕空间-覆盖模式是最常用且性能最优的模式。在此模式下,UI 将绘制在屏幕的最顶层,完全独立于任何场景摄像机

特点

  • 顶层渲染:UI 会覆盖在游戏画面之上,无视场景中的 3D 物体。
  • 自动适配:Canvas 自动匹配屏幕分辨率,UI 元素根据设置的缩放策略自动调整大小。
  • 无交互:UI 无法与 3D 场景产生遮挡或被光照影响。

机制与参数

渲染流程跳过常规的摄像机投影计算,直接由 GPU 绘制到帧缓冲区,效率极高。通过 Sort Order 参数控制多个 Canvas 的叠加顺序,值越大则显示在越上层。

关键参数说明与建议
Pixel Perfect消除边缘锯齿。注意:可能导致动态元素的平滑移动产生"跳跃感"。
Sort Order设置渲染优先级(如主界面为 10,弹窗为 20)。
Target Display多显示器设备上指定渲染目标。

适用场景

  • 传统 2D UI:菜单、HUD、设置界面。
  • 静态信息:分数、金币数、常驻提示图标。
  • 需与 3D 场景交互的 UI

性能优化

  1. 减少网格重建:避免频繁更新文本,采用事件驱动更新。
  2. 禁用冗余射线检测:对非交互元素取消勾选 Raycast Target
  3. 动静分离:将动态与静态元素分属不同 Canvas,以减少重绘范围。
  4. 合并绘制:使用 Sprite Atlas 打包碎图,促进动态合批。

二、屏幕空间 - 摄像机 (Screen Space - Camera)

此模式是功能与性能的完美平衡点。Canvas 被渲染到一个由指定摄像机生成的、与摄像机保持固定距离(Plane Distance)的虚拟平面上。

特点

  • 与场景交互:位于此平面前后的 3D 物体可以与 UI 产生自然的遮挡关系。
  • 受摄像机影响:UI 会受指定的 Render Camera 的投影模式、光照和后期处理效果(如 Bloom)影响。
  • 屏幕自适应:UI 依然会保持屏幕自适应,但其位置和深度由摄像机控制。

参数与应用

参数说明
Render Camera(必需)指定用于渲染此 UI 的摄像机。
Plane Distance定义 UI 平面与摄像机的距离,直接影响遮挡关系。
Sorting Layer/Order in Layer精细控制画布间的渲染顺序。

与摄像机投影模式的关系:

  • 正交模式 (Orthographic)推荐组合。UI 无透视变形,交互精准,适用于需融入场景又需保真交互的 UI。
  • 透视模式 (Perspective):UI 会产生透视变形,可能导致交互错位。适用于 VR 或需要强透视感的特殊 3D UI。

适用场景

  • 需光影效果的 UI:让技能栏、血条等接受场景光照和后期处理,提升沉浸感。
  • 需简单遮挡的 UI:实现"角色走到提示板后面"的效果。
  • VR/AR 应用:UI 必须持续正对玩家双眼且能融入环境,是该领域的标准模式。

三、世界空间 (World Space)

这是功能最强大、最自由的模式。Canvas 完全变为场景中的一个普通 3D 对象,其显示与否、大小、角度完全由它在世界空间中的 Transform 决定。

特点

  • 完全的 3D 对象:拥有真实的位置、旋转和缩放,像任何 3D 模型一样。
  • 完全的交互:与场景环境深度交互,自然地被遮挡、产生透视变形。
  • 手动管理:需要手动调整其位置和大小以适应场景。

与摄像机的关系

Canvas 的视觉表现完全取决于观察它的摄像机:

  • 透视摄像机:UI 会呈现"近大远小"的透视效果,角度不正时会梯形畸变。
  • 正交摄像机:UI 无透视变形,大小恒定,非常适合 2D 游戏或需要固定大小的世界 UI。

设置与注意事项

  1. 添加 Graphic Raycaster:必须确保有此组件,UI 才能响应点击事件。
  2. 调整初始缩放:Canvas 初始尺寸极大,通常需将 Scale 设置为 (0.001, 0.001, 0.001) 再调整。
  3. 注意性能这是性能开销最高的模式,每个 World Space Canvas 都会产生独立的 Draw Call,应谨慎使用。
  4. 解决深度冲突:微调 Z 轴位置或使用 Sorting Layer 避免 UI 与场景几何体闪烁。

适用场景

  • VR/AR 界面:将 UI 放置在虚拟或真实空间的特定位置。
  • 游戏内实体 UI:车载显示屏、控制台 hologram、角色手中的地图。
  • 叙事性 UI (Diegetic UI):UI 本身就是游戏世界的一部分。

总结与选择

三种模式在性能开销功能灵活性与场景的交互性上形成了清晰的梯度:

特性Screen Space - OverlayScreen Space - CameraWorld Space
性能开销✅✅✅ ✅✅
配置复杂度✅✅✅ 简单✅✅ 中等复杂
与场景交互部分 (基于平面)✅✅✅ 完全
典型应用传统 2D UI、HUD需光影、遮挡的精致 UI、VR游戏内实体屏幕、VR/AR

选择:

在这里插入图片描述

选择原则:在满足项目需求的前提下,始终选择更简单、开销更低的模式。 绝大多数情况应优先使用 Overlay,确有交互需求时再考虑 Camera 模式,World Space 则应仅用于那些必须完全融入3D世界的UI元素。

Canvas Scaler 与 Graphic Raycaster

在深入理解 Canvas 的三种渲染模式后,还有两个至关重要的组件共同构成了 UGUI 的渲染与交互体系:Canvas Scaler(画布缩放器)Graphic Raycaster(图形射线投射器)。它们一个负责控制 UI 的“视觉尺寸”,一个负责处理 UI 的“触觉交互”。


贰——Canvas Scaler:UI 的缩放遥控器

Canvas Scaler 就像是 UI 的“缩放遥控器”。它的核心职责是:确保你在不同分辨率、不同尺寸的屏幕上,看到的 UI 布局和大小都符合你的设计预期。 没有它,你的 UI 在高分辨率设备上可能小得看不清,在低分辨率设备上又大得超出屏幕。

一、三种缩放模式

Canvas Scaler 提供了三种主要的缩放策略,你可以根据项目类型进行选择。

缩放模式工作方式好比是…适用场景
Constant Pixel Size(恒定像素大小)UI 元素永远保持相同的像素值。屏幕分辨率越高,UI 看起来越小“绝对标尺”。一个 100x100 像素的图片,在任何屏幕上都是 100 像素,但它在 4K 屏幕上看起来就会比在 1080P 屏幕上小得多主要用于桌面端游戏或应用,因为PC显示器分辨率相对固定,且用户期望UI元素像素精准。
Scale With Screen Size(随屏幕大小缩放)(最常用) 设定一个参考分辨率(如 1920x1080)。Scaler 会根据当前屏幕分辨率与参考分辨率的比例,对整个 Canvas 进行缩放。“等比缩放模型”。你做了一个 1:100 的飞机模型(参考分辨率),现在要把它放进不同大小的盒子(屏幕)里。为了填满盒子,你会按比例将模型放大或缩小,但模型本身的比例不变。绝大多数移动端和全平台游戏的首选。能保证 UI 在不同宽高比的屏幕上都能较好地自适应。
Constant Physical Size(恒定物理大小)尝试让 UI 元素在不同DPI(每英寸像素数) 的屏幕上保持相同的物理尺寸(如英寸、厘米)。“现实标尺”。希望一个按钮在手机上和平板上的实际物理长度都是 1 厘米,尽管它们的分辨率和DPI完全不同。较少使用,通常用于对物理尺寸有严格要求的特定应用或AR/VR中。

Screen Match Mode 只有三种:

  1. Match Width Or Height
  2. Expand
  3. Shrink

下面逐个讲清楚,再重点解释 Match Width Or Height 里的 Match 滑条(0~1) 到底在干什么,并给具体例子。


1) Match Width Or Height(最常用)

原理

Unity 先把当前屏幕宽高和**参考分辨率(Reference Resolution)**做比值,得到两条缩放因子:

  • scaleW = 当前宽 / 参考宽
  • scaleH = 当前高 / 参考高

然后用一个插值系数 Match 把这两条因子合成一条最终缩放因子:

scale = scaleW * (1-Match) + scaleH * Match
  • Match = 0 → 100 % 按 宽度 缩放
  • Match = 1 → 100 % 按 高度 缩放
  • Match = 0.5 → 宽度、高度各取一半权重
例子
参考分辨率实际屏幕Match缩放因子计算结果说明
1920×10801280×72001280/1920 = 0.667完全按宽度做 0.667 倍缩放,高度留白/裁剪
1920×10801280×7201720/1080 = 0.667完全按高度做 0.667 倍缩放,宽度留白/裁剪
1920×10802280×1080(19:9 手机)02280/1920 = 1.187画面被横向撑大,上下被裁剪
1920×10802280×10800.50.5×1.187 + 0.5×1 = 1.093横向略大,纵向略大,兼顾两边

2) Expand(“撑开”)

  • 永远选较小的那条缩放因子,保证 整个参考分辨率能完整塞进屏幕
  • 结果:UI 不会超出屏幕,但可能在左右或上下出现黑边 / 空白
例子
参考分辨率实际屏幕计算结果
1000×500800×600min(800/1000, 600/500) = 0.8整个画布缩小到 0.8 倍,左右出现黑边

3) Shrink(“裁切”)

  • 永远选较大的那条缩放因子,保证 屏幕被画布完全覆盖
  • 结果:UI 可能超出屏幕,需要额外处理 SafeArea。
例子
参考分辨率实际屏幕计算结果
1000×500800×600max(800/1000, 600/500) = 1.2整个画布放大到 1.2 倍,上下被裁剪

一句话总结

  • Match Width Or Height 用 Match 滑条决定“听宽的还是听高的”,0 全听宽,1 全听高,中间值混合。
  • Expand 保证 UI 全看见,可能留黑边。
  • Shrink 保证不留黑边,可能被裁剪。

二、与渲染模式的关系

Canvas Scaler 的工作与渲染模式深度耦合,但其重要性因模式而异:

  1. Screen Space - Overlay / Camera:

    • 至关重要。在这两种模式下,Canvas 的尺寸直接由 Scaler 驱动,以匹配屏幕或摄像机的视口。
    • 你设定的 “参考分辨率” 就是在 Scale With Screen Size 模式下的设计基准。
    • 比喻:就像是你先画好了一张标准的设计图(参考分辨率),Scaler 负责把它精准地投影到不同大小和距离的幕布(屏幕或摄像机平面)上。
  2. World Space:

    • 几乎无用。在此模式下,Canvas 的尺寸完全由它在 3D 世界中的 Transform.Scale 决定。
    • Canvas Scaler 组件会被忽略,UI 元素的大小和布局不再与屏幕分辨率有关,只取决于它作为 3D 物体的大小。
    • 比喻:World Space 模式下的 UI 就像一个真实的广告牌。它的物理尺寸是固定的(比如 10米 x 5米)。你离它远,它在你的视野里就小;离它近,就大。这个大小和你手机的分辨率没关系,只和你的“观看距离”(摄像机位置)有关。

叁——Graphic Raycaster

Graphic Raycaster 是 UI 能够“被点击”、“被触摸”的根源。它就像是 UI 的 “触觉神经” ,负责从用户的点击(鼠标或触摸)发射一条射线,去检测这条射线是否击中了某个带有 Raycast Target 属性的 UI 元素。

一、工作机制

  1. 发射射线:当用户点击屏幕时,Raycaster 会根据当前 Canvas 的渲染模式,从相应位置发射一条检测射线。
  2. 检测碰撞:这条射线会与 Canvas 内所有启用了 Raycast Target 的 Graphic 组件(如 Image, Text, RawImage)进行碰撞检测。
  3. 返回结果:将所有被击中的UI元素按深度排序后,返回给事件系统(EventSystem),最终触发 OnClick, OnDrag 等事件。

二、与渲染模式的关系(区别)

Graphic Raycaster 的射线发射方式完全取决于 Canvas 的渲染模式,这是理解关键!

渲染模式射线发射原理好比是…注意事项
Screen Space - Overlay直接从屏幕点击坐标发射一条垂直于屏幕的射线。不依赖任何摄像机“点击屏幕玻璃”。你点击的是屏幕这个二维平面上的一个绝对坐标点,Raycaster 直接去找这个坐标点上有哪些UI。最直接,最不容易出错。
Screen Space - Camera渲染该Canvas的摄像机出发,根据屏幕点击坐标发射一条世界空间中的射线。这条射线会与位于 Plane Distance 处的 Canvas 平面相交。“用手电筒照玻璃板”。你的点击位置决定了手电筒(摄像机)照射的角度,光线(射线)最终会打在固定距离外的玻璃板(Canvas)上某个点。如果摄像机是透视模式,由于UI有透视变形,可能导致视觉上的按钮实际可点击的碰撞区不重合,造成点击错位。
World Space主摄像机(或 World Camera)出发,根据屏幕点击坐标发射一条标准的3D 射线。这条射线会与作为3D物体的 Canvas 进行碰撞检测。“用激光笔照射广告牌”。你拿着激光笔(摄像机)照射真实的广告牌(Canvas),激光点落在广告牌的哪个位置,就触发哪个按钮。必须保证 Canvas 上有 Graphic Raycaster 组件!
可能被3D物体阻挡:如果场景中有3D物体(如一个盒子)挡在 Canvas 前面,射线会被盒子拦截,导致无法点击到后面的UI。

三、参数与性能优化

  • Ignore Reversed Graphics一定要勾选。这会忽略掉那些背对着摄像机的UI元素(比如在World Space模式下旋转了180度的UI)的点击事件,符合直觉且提升性能。
  • Blocking Objects / Blocking Mask(World Space 特有):极其重要! 用于解决上述“3D物体阻挡点击”的问题。
    • Blocking Objects:指定哪些类型的3D物体会阻挡射线(如选择 3D Physics,则所有带有Collider的3D物体都会阻挡)。
    • Blocking Mask:更进一步,通过Layer指定具体哪些层的3D物体会阻挡。
  • 性能优化
    • 取消非交互元素的 Raycast Target:这是最重要的优化手段。对于背景图、装饰性图片等不需要点击响应的元素,务必取消勾选此选项,能极大减少射线检测的计算量。
    • 避免过深的UI层级:Raycaster 需要遍历所有子物体,层级过深会增加遍历时间。

总结与关系梳理

为了让您更好地复习和理解,以下是这两个组件与三种渲染模式关系的终极总结表:

UGUI核心组件关系
渲染模式决定
Screen Space - Overlay
Screen Space - Camera
World Space
Canvas Scaler
至关重要
负责屏幕自适应
Graphic Raycaster
射线垂直于屏幕
无视任何3D物体
Canvas Scaler
至关重要
基于参考分辨率缩放
Graphic Raycaster
射线从渲染摄像机发出
透视模式下可能点击错位
Canvas Scaler
几乎无效
尺寸由Transform决定
Graphic Raycaster
射线从主摄像机发出
需注意3D物体阻挡

记忆:

  1. Canvas Scaler“视觉” 的管家,它在 OverlayScreen Space - Camera 模式下忙前忙后,但在 World Space 模式下就“下岗”了。
  2. Graphic Raycaster“交互” 的枢纽,它在三种模式下都工作,但工作原理完全不同
    • Overlay:最简单,直接对应屏幕坐标。
    • Camera:依赖指定摄像机,小心透视畸变!
    • World Space:最复杂,完全3D物理射线,小心前方遮挡!
http://www.xdnf.cn/news/1444771.html

相关文章:

  • 【音视频】FMP4 介绍
  • 【正点原子K210连载】第三十一章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • 【论文阅读】-《THE JPEG STILL PICTURE COMPRESSION STANDARD》
  • Android 接入deepseek
  • 关于ES中文分词器analysis-ik快速安装
  • k8s使用StatefulSet(有状态)部署单节点 MySQL方案(使用本地存储)
  • 【Bug】Nexus无法正常启动的五种解决方法
  • SuperMap GIS基础产品FAQ集锦(20250901)
  • Elasticsearch 数字字段随机取多值查询缓慢-原理分析与优化方案
  • 504 Gateway Timeout:服务器作为网关或代理时未能及时获得响应如何处理?
  • 揭秘设计模式:优雅地为复杂对象结构增添新功能-访问者模式
  • go语言面试之Goroutine详解
  • Linux使用-Linux系统管理
  • WPF里的几何图形Path绘制
  • 硬件驱动C51单片机——裸机(1)
  • 三、Scala方法与函数
  • 【面试场景题】1GB 大小HashMap在put时遇到扩容的过程
  • 安卓系统中IApplicationThread.aidl对应的是哪个类
  • 智慧交通管理信号灯通信4G工业路由器应用
  • 【小白笔记】移动硬盘为什么总比电脑更容易满?
  • 【LeetCode热题100道笔记】括号生成
  • 系统架构设计师备考第14天——业务处理系统(TPS)
  • WebAppClassLoader(Tomcat)和 LaunchedURLClassLoader(Spring Boot)类加载器详解
  • Llama v3 中的低秩自适应 (LoRA)
  • 51单片机-LED与数码管模块
  • 2024 arXiv Cost-Efficient Prompt Engineering for Unsupervised Entity Resolution
  • JetBrains 2025 全家桶 11合1 Windows直装(含 IDEA PyCharm、WebStorm、DataSpell、DataGrip等)
  • Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?
  • 终于有人把牛客网最火的Java面试八股文整理出来了,在Github上获赞50.6K
  • 使用 PHP Imagick 扩展实现高质量 PDF 转图片功能