Unity渲染顺序RenderQueue、SortingLayer、SortingOrder关系

Unity自带了一套物体间的决定渲染顺序的参数,其中最重要的三个为:SortingOrder、SortingOrder、RenderQueue。

SortingLayer在Inspector面板中点击Tag -> AddTag -> SortingLayer,可以添加自定义的sortingLayer,默认的sortingLayer为Default, 

自定义的SortingLayer可以拖拽改变前后关系,SortingLayer的第一个将是默认的层级,会将所有的已经创建的物体的sortingLayer属性都自动设置为第一个。因此如果想要做层级划分,最好在游戏开始设计之时就开始划分好对应的层级,至少第一个层级需要想好,否则后期改起来是个大工程。

在讨论SortingLayer跟SortingOrder之前,需要知道RenderQueue。因为RenderQueue起到一个关键的作用。它处于shader层面,并且与具体的数值表示透明不透明等渲染队列顺序。如下图:​​

当RenderQueue填-1是使用shader自定义的值,否则使用手动填的值,具体位置在材质的inspector面板的最底下:

​​

Shader RerderQueue

上面的队列列表少了一个关键的区域[2450,2500],正确的应该是这样的:​​

RederQueue

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也会出现穿透现象



作者:侠者大屁屁
链接:https://www.jianshu.com/p/7a033810706f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值