1 Camera
Camera是unity中最优先的渲染顺序控制。depth越大,渲染顺序越靠后。
2、Sorting Layer
在Tags & Layers设置中可见
3、Order In Layer
相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效。
4、RenderQueue
Shader中对Tags设置的“Queue”。
当Sorting Layer和Order In Layer相同时
RenderQueue小的先进渲染管线。
当Sorting Layer和Order In Layer不相同时!
当两个材质使用了不同的RenderQueue,且这两个RenderQueue都在[0~2500]或[2501~5000]时,SortingLayer和OrderInLayer的排序生效。
当两个材质使用了不同的RenderQueue,且这两个RenderQueue分别在[0~2500]和[2501~5000]时,则一定会按照RenderQueue绘制,无视SortingLayer、OrderInLayer的排序
5、 MeshRenderer 和SpriteRenderer 都是继承于 Renderer 的组件
它们的 sorting 和 orderinlayer 都是暴露出来的属性 可以在属性视图修改
模型蒙皮 skinned mesh render 虽然也继承了 Renderer 但在属性视图没有出现该属性 一般只能更改蒙皮的shader RenderQueue 调整默认sorting layer 和 Orderinlayer下 和其他物体的层级
所以一般设置材质的renderQueue或直接在shader中设置。
在ShaderLab中,有4个提前定义好的render queue,你可以设置更多的在他们之间的值:
Background :表示渲染在任何物体之前
Geometry(default):渲染大多数几何物体所用的render queue
AlphaTest:用于alpha测试
Transparent:用于渲染半透明物体
Overlay:渲染所有物体之上
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果混用 2DUI 和 模型 模型又穿插在两个 NGUI panle中间 不通过增加摄像机数量来解决的话应该怎么办:
默认情况下 游戏中只有一个默认的 sorting layer , 和一个默认的 OrderInLayer 。 所有物体都在一个 sorting layer 和
OrderInLayer 下面 ,
这时候设置渲染顺序的方式就是通过更改 RenderQueue ,较小的先渲染 , Ngui panle 会默认根据drawcall 优化操作 设置当前panle下的ui RenderQueue (一般是3000起)。
Automatic:由NGUI自动生成
StartAt:手动设置一个值
Explicit:同一个panel下的RenderQueue的值相同
看代码可以理解一下,UIPanel.cs
而使用 skinned mesh render , 则是更改使用材质处shader 的 skinned mesh render , 设置值在两个panle RenderQueue 之间就行了。
如果是使用龙骨和spine 动画还有粒子系统的话, 层级控制就只能在默认 sorting layer 下更改 龙骨、 spine、粒子系统的 orderinlayer , 再打开 ngui panle 上的 oder in layer 选项, 通过设置3者之间的oder in layer值调整顺序就好了 。
再加上 使用skinned mesh render 蒙皮的模型的话,在开启ngui panle的 oder in layer 后, 由于模型默认在最低的 order in layer 下,此时 ,再怎么调整模型的 shader RenderQueue 模型都不会渲染到最上面,解决办法是:
通过脚本获取 模型 skinned mesh render 的 oderinlayer 参数, 并修改它的值穿插在各层之间
(1 性能上可能增加drawCall 还未具体测试过 , 模型是不是这样修改渲染层级我也不知道 ,没怎么用过 ,这只是我自己的解决方案。 2 还于到一个情况 ,如果Ngui的panle 打开了Oder in layer 选项而又 设值为0 的情况下 ,该panle下的对象 可能渲染到最上层,原因可能要看代码了)。