找回密码
 立即注册
查看: 253|回复: 0

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

[复制链接]
发表于 2022-11-23 09:39 | 显示全部楼层 |阅读模式
Unity自带了一套物体间的决定渲染顺序的参数,其中最重要的三个为:SortingOrder、SortingOrder、RenderQueue。

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

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

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


1.png

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


2.png

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

3.png

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

4.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-27 22:17 , Processed in 0.099013 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表