調整SortingOrder解決UGUI中粒子層級問題
為了做出更酷炫的的UI效果,通常要在UI中加入粒子效果。但與純2D的UI動畫或Spine不同,粒子在場景中製作,會存在與UI的穿插問題。本文探討如何更改特效或UI的SortingOrder避免穿插。
前提條件
首先,Canvas的型別是一切的基礎,我使用的Canvas是Screen-Space
,所有UI通過一個正交攝像機照出來。製作UI通常使用這種模式,本文不討論其他情況。
核心原理
通過更改渲染的順序來改變遮擋關係。一方面UGUI會根據Hierarchy
中的控制元件順序進行排序。因此對於Animation或Spine製作的UI動畫,只要順序正確,就可以保證遮擋關係正確。對於使用ParticleSystem
Render
進行渲染,因此需要找到一個能夠同時影響Render和UI控制元件渲染層次的方法。這個方法就是更改SortLayer或SortingOrder。這兩種方法原理一樣,先排序,再渲染。這個排序通過SortingOrder更改,而排序和排序之前可以通過SortLayer來分隔。以我目前的經驗,使用SortingOrder足夠,還沒有用到SortLayer。
案例
為了說的更清楚我製作了個簡單的例子,效果如下圖所示:
它在Hierarchy
中的層級關係如下:
不難看出,介面層級關係很簡單。大體上分為左區域、右區域、標題三部分,每部分中都包含底圖。左右區域分別有兩個按鈕。最終效果是左側的區域完全被特效覆蓋,右側區域底圖被特效覆蓋,按鈕在特效上層,標題區域所有內容顯示在特效上。其中所有UI使用標準UGUI材質,粒子特效使用系統自帶Particles/Additive
詳解
如第二節核心原理所述,我需要規劃出SortingOrder
。為了達到這個效果,左側區域使用預設的SortingOrder,也就是0。粒子使用1,即SortingOrder+1。右側區域Button和整個Title使用SortingOrder+2。
粒子設定
在ParticleSystem
中,找到Render更改它的SortingOrder為1:
UI設定
UGUI中SortingOrder
變數定義在Canvas中,因此需要是該類或其子類才能實現設定。這裡需要為Button1和Title新增一個Canvas。因為Canvas也會附帶更改它子節點的層級,所以Title下面的SortingOrder
GraphicRaycaster
。
以上就是所有設定,播放粒子是效果圖的效果了。
警告
即使SortingOrder
相同也無法將不同Canvas的DarwCall合併,所以要儘可能的減少Canvas。儘量不要在加入特效時通過動態新增Canvas,來更改UI的SortingOrder
。這樣做會使UI中的Canvas不可控,不利於後期DrawCall優化。最好根據自己專案提前做好UI分層,從設計上處理好SortingOrder
。