Unity自帶了一套物體間的決定渲染順序的參數(shù)词裤,其中最重要的三個(gè)為:SortingOrder刺洒、SortingOrder、RenderQueue吼砂。
SortingLayer在Inspector面板中點(diǎn)擊Tag -> AddTag -> SortingLayer逆航,可以添加自定義的sortingLayer,默認(rèn)的sortingLayer為Default,?
自定義的SortingLayer可以拖拽改變前后關(guān)系渔肩,SortingLayer的第一個(gè)將是默認(rèn)的層級(jí)因俐,會(huì)將所有的已經(jīng)創(chuàng)建的物體的sortingLayer屬性都自動(dòng)設(shè)置為第一個(gè)。因此如果想要做層級(jí)劃分周偎,最好在游戲開始設(shè)計(jì)之時(shí)就開始劃分好對(duì)應(yīng)的層級(jí)抹剩,至少第一個(gè)層級(jí)需要想好,否則后期改起來是個(gè)大工程蓉坎。
在討論SortingLayer跟SortingOrder之前澳眷,需要知道RenderQueue。因?yàn)镽enderQueue起到一個(gè)關(guān)鍵的作用蛉艾。它處于shader層面钳踊,并且與具體的數(shù)值表示透明不透明等渲染隊(duì)列順序。如下圖:??
當(dāng)RenderQueue填-1是使用shader自定義的值勿侯,否則使用手動(dòng)填的值拓瞪,具體位置在材質(zhì)的inspector面板的最底下:
??
上面的隊(duì)列列表少了一個(gè)關(guān)鍵的區(qū)域[2450,2500]罐监,正確的應(yīng)該是這樣的:??
2500是關(guān)鍵值吴藻,它是透明跟不透明的分界點(diǎn),因此我們考慮層級(jí)的時(shí)候要注意著點(diǎn):
renderqueue > 2500的物體絕對(duì)會(huì)在renderqueue <= 2500的物體前面弓柱,即渲染時(shí)renderqueue大的會(huì)擋住renderqueue小的沟堡,不論它的sortingLayer和sortingOrder怎么設(shè)置都是不起作用的。知道了這點(diǎn)矢空,其他的就很好理解了航罗。
當(dāng)兩個(gè)的RenderQueue都在同一側(cè)時(shí),在SortingLayer高的絕對(duì)會(huì)在sortingLayer前面屁药,無視r(shí)enderqueue跟soringOrder粥血,只有在sortingLayer相同的前提下,soringOrder高的會(huì)在sortingOrder低的前面,無視r(shí)enderqueue复亏。當(dāng)sortingLayer跟sortingOrder相同時(shí)趾娃,才看renderqueue的高低,高的在前面缔御。
因此只需要每當(dāng)我們需要在ui中間夾著特效的時(shí)候抬闷,就有多種解決思路,
一是將ui分別放置于兩個(gè)不同的sortingLayer耕突,并將特效放于中間的sortingLayer笤成,并保證他們的renderqueue同時(shí)在2500的同一側(cè)。
二是將他們的sortingLayer都設(shè)置為同一個(gè)眷茁,并將特效的sortingOrder保持在兩個(gè)ui的sortingOrder中間即可炕泳。
三是保證ui跟特效的sortingOrder跟SortingLayer相同,并保持特效的renderqueue在兩個(gè)ui的sortingOrder之間即可上祈。
????????需要注意的是培遵,當(dāng)使用NGUI的時(shí)候,如果開啟了Panel的SortingLayer和SortingOrder登刺,那么Panel的collider也就是碰撞檢測(cè)需要注意荤懂,因?yàn)镹GUI的Collider決定點(diǎn)擊到的哪個(gè)物體并不是由SortingLayer決定的,而是由Panel的depth*1000+widget本身的depth計(jì)算來得塘砸,因此如果Panel使用了SotringLayer跟SortingOrder节仿,可能會(huì)導(dǎo)致點(diǎn)擊穿透,而且還沒法從UI層面遮蔽掉蔬,因?yàn)樗褪窃谀闱懊胬认堋6遥琩epth也不宜過高女轿,如果超過depth超過1000箭启,那么相鄰得兩個(gè)Panel也會(huì)出現(xiàn)穿透現(xiàn)象