Unity自带了一套物体间的决定渲染顺序的参数,其中最重要的三个为:SortingOrder、SortingOrder、RenderQueue。
SortingLayer在Inspector面板中点击Tag -> AddTag -> SortingLayer,可以添加自定义的sortingLayer,默认的sortingLayer为Default,
自定义的SortingLayer可以拖拽改变前后关系,SortingLayer的第一个将是默认的层级,会将所有的已经创建的物体的sortingLayer属性都自动设置为第一个。因此如果想要做层级划分,最好在游戏开始设计之时就开始划分好对应的层级,至少第一个层级需要想好,否则后期改起来是个大工程。
在讨论SortingLayer跟SortingOrder之前,需要知道RenderQueue。因为RenderQueue起到一个关键的作用。它处于shader层面,并且与具体的数值表示透明不透明等渲染队列顺序。如下图:
当RenderQueue填-1是使用shader自定义的值,否则使用手动填的值,具体位置在材质的inspector面板的最底下:
上面的队列列表少了一个关键的区域[2450,2500],正确的应该是这样的:
2500是关键值,它是透明跟不透明的分界点,因此我们考虑层级的时候要注意着点:
renderqueue > 2500的物体绝对会在renderqueue <= 2500的物体前面,即渲染时renderqueue大的会挡住renderqueue小的,不论它的sortingLayer和sortingOrder怎么设置都是不起作用的。知道了这点,其他的就很好理解了。
当两个的RenderQueue都在同一侧时,在SortingLayer高的绝对会在sortingLayer前面,无视renderqueue跟soringOrder,只有在sortingLayer相同的前提下,soringOrder高的会在sortingOrder低的前面,无视renderqueue。当sortingLayer跟sortingOrder相同时,才看renderqueue的高低,高的在前面。
因此只需要每当我们需要在ui中间夹着特效的时候,就有多种解决思路,
一是将ui分别放置于两个不同的sortingLayer,并将特效放于中间的sortingLayer,并保证他们的renderqueue同时在2500的同一侧。
二是将他们的sortingLayer都设置为同一个,并将特效的sortingOrder保持在两个ui的sortingOrder中间即可。
三是保证ui跟特效的sortingOrder跟SortingLayer相同,并保持特效的renderqueue在两个ui的sortingOrder之间即可。
需要注意的是,当使用NGUI的时候,如果开启了Panel的SortingLayer和SortingOrder,那么Panel的collider也就是碰撞检测需要注意,因为NGUI的Collider决定点击到的哪个物体并不是由SortingLayer决定的,而是由Panel的depth*1000+widget本身的depth计算来得,因此如果Panel使用了SotringLayer跟SortingOrder,可能会导致点击穿透,而且还没法从UI层面遮蔽,因为他就是在你前面。而且,depth也不宜过高,如果超过depth超过1000,那么相邻得两个Panel也会出现穿透现象