Unity 2D 渲染排序
翻譯自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有不一致的排序優先順序。