在Unity中,控制元素的层级排序(渲染顺序)是确保场景正确显示的关键。以下是常见的层级排序方式及其适用场景:
1. 通过GameObject的层级顺序(Sorting Layer/Order in Layer)
适用对象:2D精灵(SpriteRenderer)、UI元素(Canvas)、粒子系统等。
- Sorting Layer
在Tags and Layers
设置中创建自定义层级(如"Background", “Characters”, “UI”),将对象分配到不同层级。高层级永远显示在低层级之上。 - Order in Layer
同一Sorting Layer内的对象通过此数值排序,数值越大越靠前。
// 代码示例(SpriteRenderer)
GetComponent<SpriteRenderer>().sortingLayerName = "Characters";
GetComponent<SpriteRenderer>().sortingOrder = 10;
2. 通过Z轴坐标(3D场景)
适用对象:3D物体。
Unity默认根据摄像机视角的Z轴距离排序(透视投影时),或直接按Z轴值(正交投影时)。
- 正方向:Z值越大离摄像机越远(可能被遮挡)。
- 负方向:Z值越小离摄像机越远(取决于坐标系)。
3. UI元素的层级控制(Canvas)
适用对象:UGUI系统。
- Canvas层级
- Screen Space模式:通过Canvas的
Sort Order
属性控制画布层级,数值高的覆盖低的。 - World Space模式:结合Sorting Layer和Order in Layer。
- Screen Space模式:通过Canvas的
- UI子物体顺序
同一Canvas下,Hierarchy面板中的顺序决定渲染顺序(下方的物体后渲染,显示在上层)。
// 动态调整UI顺序
transform.SetAsLastSibling(); // 置顶
transform.SetSiblingIndex(1); // 指定位置
4. 渲染队列(Shader中的Queue)
适用对象:自定义Shader或材质,控制透明/不透明物体的渲染顺序。
- 内置队列:
Background
(1000)Geometry
(2000, 默认)AlphaTest
(2450)Transparent
(3000, 从后到前渲染)Overlay
(4000)
- 自定义队列:
在Shader中声明Queue
值(如Queue = Geometry+100
)。
// Shader示例
SubShader {
Tags { "Queue" = "Transparent" }
// ...
}
5. 摄像机深度(Camera Depth)
适用对象:多摄像机场景。
- 在Camera设置中调整
Depth
值,数值高的摄像机后渲染,覆盖之前的画面。 - 结合
Clear Flags
控制清除规则(如仅渲染UI的摄像机设为Depth Only
)。
6. 粒子系统排序
适用对象:Particle System。
- 通过
Renderer
模块设置Sorting Layer
和Order in Layer
。 - 可选
Sort Mode
(如按距离、深度等)。
7. 自定义排序(脚本控制)
适用场景:动态调整渲染顺序(如角色移动时改变层级)。
// 动态修改Sorting Order
void Update() {
if (isMoving) {
GetComponent<Renderer>().sortingOrder = 20;
}
}
选择建议
- 2D游戏:优先使用
Sorting Layer
+Order in Layer
。 - UI系统:利用Canvas层级和Hierarchy顺序。
- 3D场景:调整Z轴或Shader队列(透明物体用
Transparent
队列)。 - 复杂场景:结合多种方式(如多摄像机+分层渲染)。
通过灵活组合这些方法,可以精准控制Unity中元素的显示层级。