一、UI
UI算drawcall是按照Hierarchy面板 优先深度遍历后检查相邻是否材质相同,如:
Canvas
├─ BackgroundImage (Image)
├─ ScrollView
│ └─ Viewport
│ └─ Content
│ ├─ Images
│ └─ Texts
├─ PopupButton (Image)
└─ PopupButtonLabel (TMP)
深度优先展开结果是:
BackgroundImage (Image)
Content.Sprites.* (Image)
Content.Texts.* (TMP)
PopupButton (Image)
PopupButtonLabel (TMP)
我们需要做的是,让相同材质的UI尽量相邻,放到一个空物体下,比如
Canvas
|------ImageAs
|------Texts
|------ImageBs
|------TextsB
一个图集中的sprite当然也被视为同一个材质。
二、2d游戏
对所有会画到一个相机上的Renderer(SpriteRenderer / TilemapRenderer / ParticleSystem 等):
-
先按Sorting Layer排
-
在 Project Settings → Tags and Layers 里你定义的那几个 Layer:
-
Default
-
Background
-
Player
-
Front
-
UI
-
-
层级列表从上到下:越靠下的,越后画 → 越在"上面"。
-
也可以用
renderer.sortingLayerName/sortingLayerID改。
-
-
同一个 Sorting Layer 内:按 Order in Layer 排
-
SpriteRenderer.sortingOrder(Inspector 的 "Order in Layer") -
数字越大 → 越后画 → 越在"上面"。
-
-
同一个 Layer + 同一个 Order 时:看"距离相机"
-
默认是按 Z 轴 距离相机排序:离相机更近的,后画。
-
2D 模式通常相机在 (0, 0, -10),Z 越大越离相机越近(-9 > -10)。
-
Project Settings → Graphics → Transparency Sort Mode 可以改成:
-
Default(用 Z)
-
Custom Axis(比如 2D 里常用 Y 轴,让 Y 越小越在上面之类)
-
-
所以一般,一个SortingLayer的都在一个图集里,或将一个图集的放在一个SortingLayer和Order。