翻译自Unity - Manual: 2D Sorting (unity3d.com)
为什么翻译这篇文章?自己想搞明白Unity渲染物体的顺序,遂去搜索相关资料,发现较好的一篇博客也只是把其中几个因素(Render Queue,Sorting Order等)罗列出来,至于Unity具体怎么使用它们以及它们之间的优先级没有讲清楚,故而想把清楚解释这个问题的官方手册翻译下。
2D 排序
概览
Unity根据优先级排序渲染,优先级是基于它们的类型和用法。你可以通过Render Queue指定渲染顺序。一般,有两个主要队列,不透明队列Opaque queue和半透明队列Transparent queue。2D渲染主要是在Transparent queue,其中包含Sprite Renderer,Tilemap Renderer,和Sprite Shape Renderer这些类型。
半透明队列排序的优先级
Transparent Queue里的2D Renderers一般遵循以下优先级:
- Sorting Layer和Order in Layer
- 指定Render Queue
- 到相机的距离
- 透视/正交
- 自定义轴排序
- 精灵排序参照点
- Sorting Group
- 材质/着色器
- 当多个Renderer有相同的排序优先级时,Tiebreaker出现
有其它能够引起sorting order不同于有规律优先级顺序的因素。这些因素因工程不同而不同。
Sorting Layer and Order in Layer
对于2D Renderers,通过Inspector窗口或Unity API修改Sorting Layer和Order in Layer(在Renderer的属性设置里)是有效的。设置Renderer到一个存在的Sorting Layer或者创建一个决定它的在渲染队列里的优先级。在相同Sorting Layer里,修改Order in Layering的值设置Renderer和其它Renderer的优先级。
指定渲染队列
你可以在材质球设置或者材质球着色器设置里指定Renderer的渲染队列。对于组织和排序使用不同材质球的Renderers,这是有用的。详细内容可以参照文档https://docs.unity3d.com/Manual/SL-SubShaderTags.html。
到相机的距离
相机组件基于投影设置排序Renderer,两个选项分别是透视和正交。
透视
在这个模式,Renderer排序距离是Renderer到相机位置的直线距离。
正交
Render排序距离是相机沿着相机观察方向到Renderer的距离。对于默认2D设置,是沿(0,0,1)轴向。
当你设置相机组件为透视或正交时,Unity自动设置相机TransparencySortMode以匹配相机已选择模式。你可以两种方式手动设置Transparency Sort Mode:
- 打开Project Settings并前往Graphics,然后Camera Settings下面是用Transparency Sort Mode
- 通过脚本API设置相机TransparencySortMode
一个额外的通过Project Settings和通过脚本API可以设置的是自定义轴向排序模式。
自定义轴向排序模式
选择这个模式排序Renderer是基于沿着你在Projecting Settings里设置的自定义轴向的距离(主菜单:Edit > Project Settings > Graphics > Transparency Sort Axis)。常用在包含IsoMetric Tilemaps的工程,用于在Tile Map上正确排序绘制Tile Sprites。详细参考Creating an Isometric Tilemap。
Sprite排序点
默认,Sprite的排序点设置在中心位置,Unity测量相机变换位置和Sprite中心位置的距离,然后在排序中决定它们的渲染顺序。一个可供替代的选项是,在世界空间里设置Sprite的Pivot为排序点。在Sprite的Sprite Renderer属性设置选择Pivot选项,并且在Sprite编辑器里编辑Sprite的Pivot位置。
Sorting Group
Sorting Group是为了排序把共享一个通用根的Renderer组织起来的组件。在同一个Sorting Group的所有Renderer共享同样的Sorting Layer,Order in Layer,和到相机的距离。设置的更多细节参考Sorting Group组件的文档。
Tiebreaker
当多个Renderer有一致的排序优先级时,tiebreaker是按照Unity放置Renderer到渲染队列的顺序。因为这是你无法控制的内部处理,你应该使用排序选项(比如Sorting Layers和Sorting Groups)保证所有Renderer有不一致的排序优先级。