跳到正文
0:00 / 0:00
已成形

Unity 渲染与排序:Layer、Sorting Layer 与 UI 绘制顺序

3 分钟

AI 摘要

厘清 Unity 中 Layer、Sorting Layer 与 Sibling Index 的职责边界,指出相机剔除仅依据 Canvas 节点 Layer 生效,并详解 UI 射线检测、异形遮罩及不同渲染器透明度控制的正确入口与避坑要点。

在 Unity 里「谁盖住谁」和「谁能点到」是最容易踩坑的两件事。这篇把渲染排序、Layer 的职责边界,以及 UI 射线检测、遮罩、透明度这几块经验集中整理出来。

一、每种可视元素都有自己的 Renderer

Canvas(UI)、ParticleSystem(粒子)、SpriteRenderer(精灵)、Spine(SkeletonRenderer / SkeletonGraphic)本质上都是带 Renderer 的可视元素,它们的渲染优先级都遵循同一套规则——Sorting Layer(排序层)+ Order in Layer:

  • Sorting Layer 的值越大,渲染优先级越高,在渲染队列里越靠前,最终显示在越上层。
  • 同一 Sorting Layer 内,再由 Order in Layer 决定先后。

所以像「让粒子盖住 UI」或「让 UI 盖住精灵」这类跨类型的层级控制,靠的是把它们的 Sorting Layer / Order in Layer 排好,而不是靠 Layer。

二、Layer ≠ Sorting Layer ≠ 渲染顺序

这是最容易混淆的一组概念,职责完全不同:

概念 作用域 是否参与绘制排序
GameObject 的 Layer 物理碰撞检测、射线检测、摄像机 Culling Mask(剔除) 不参与
Sorting Layer + Order in Layer Canvas / Renderer 组件属性,决定不同 Canvas、不同 Renderer 绘制批次的先后 参与
Sibling Index(Hierarchy 同级顺序) 同一个 Canvas 内部,元素之间的覆盖关系 参与(同级内相对顺序)

结论:

  • Layer 是给「物理 / 射线 / 相机剔除」用的,例如让某台相机只渲染 UI 层、让射线忽略 Ignore Raycast 层。
  • 控制 Canvas 之间的顺序,用 Sorting Layer 和 Order in Layer。
  • 控制同一个 Canvas 内部元素的顺序,用 Hierarchy 里的同级顺序(Sibling Index)——排在下方的元素会覆盖上方的。

三、相机剔除是按「渲染组件所在节点」判断的

一个容易反直觉的点:相机剔除时,UI 是按 Canvas 所在节点的 Layer 生效的。

也就是说,即使把 Canvas 的某个子节点设为「相机不渲染的 Layer」,只要这个子节点在 Canvas 之下,它依然会被渲染出来——因为决定它是否被剔除的是 Canvas 节点的 Layer,而不是子节点自己的 Layer。

四、Canvas 的层级与缩放

  • 子 Canvas 会受到父 Canvas 的缩放影响,做嵌套 Canvas 时要留意父级 scale。
  • Overlay 模式的 Canvas 不被任何相机渲染,直接显示在屏幕最上方。因此当 Overlay Canvas 检测到点击时,事件里的相机是 null;真正发射射线的是 Canvas 上的 Graphic Raycaster,而不是相机。

五、射线检测:按钮为什么点不动

  • Raycast Target 必须为 true,该 Graphic 才会参与射线检测,从而才能触发点击等事件。
  • 按钮的可点击性取决于按钮自身或其子节点上是否有支持射线检测的组件(Image / RawImage / Text)且处于激活状态。满足这个条件时,即使挂载的图片是透明的,射线检测也能生效。
  • 水平翻转图片时,如果这张图用于按钮,注意在调整 Y 轴旋转的同时调整 X 轴旋转,否则可能因为朝向问题导致射线检测不到、按钮点击失灵。

六、遮罩:Sprite Mask 与 RectMask2D 的取舍

  • SpriteRenderer 的遮罩可以用 Sprite Mask。
  • Mask 和 RectMask2D 的裁剪机制不同:Mask 基于模板缓冲、形状自由但开销更高;RectMask2D 只做矩形裁剪、性能更好,但不能做异形遮罩。按需求选。

七、透明度控制:按渲染类型选对入口

设置透明度时,可以直接改对应 Renderer 的 alpha:

  1. Canvas(UI):CanvasRenderer.SetAlpha(...)
  2. 3D Spine:SkeletonAnimation.Skeleton.A
  3. 粒子:ParticleSystemRenderer.material.color(或改 startColor,见特效篇)

不同类型的「透明度入口」不同,改错地方不会有任何效果。

小结

一句话记法:Layer 管「谁能看见 / 谁能点到」(剔除与物理),Sorting Layer + Order in Layer 管「谁在上面」,Sibling Index 管「同一个 Canvas 里谁盖谁」。 射线检测认的是「有没有开启 Raycast Target 的组件且激活」,跟图片透不透明、翻不翻转无关。

相关:UGUI 布局与 SuperScrollView 列表实战、Spine、粒子特效与运行时材质

这是一条笔记,不是成稿文章。它可能不完整、可能有错,也可能过段时间就被我推翻。 想看成体系的文章,去 Blog。

linked from2 处引用了这篇