十、物体管理:2、场景中的物体层级管理
1、首要考虑的是相机的渲染顺序,但是根据BuildIn渲染管线和URP渲染管线,在相机上的设置上会有一个划分。
-
如果是BuildIn模式,则是相机的Death值,值越大,渲染在前面。
image.png -
如果是URP模式(2019.3之前的版本主流模式),则没有Depth相机深度值。在需要多相机渲染的时候,将需要覆盖在最上面的 相机的Render模式设置为OverLay模式,然后在Main Camera(Render模式设置为Base)的Stack上加上要叠加的相机。
image.png
image.png
2、如果大家都是同一个渲染摄像机,则开始比较物体在世界空间中的物理位置,比较Z轴值,越靠后就在后面显示,也非常直观,如下图效果,场景中的位置以及最终在画面上渲染的效果。
image.png
image.png
3、如果在世界空间中,位置也是有限的,单纯靠Z轴值去管理物体的位置会很凌乱,也很难管理,比如有一千个物体,总不能每一个物体的占用一个Z轴值,显然不合理,也不方便修改。这是就需要配合使用Sorting Layers和Order in Layer这两个参数。Sprite一类的物体的可以设定一个层级,越往下越靠前显示。比如这里的Background在最上层,显示在最后面,UI层最靠后,所以显示在前面。
image.png
image.png
4、Order in Layer,这个参数是针对,Z轴值和Order in Layer值都相同的情况下,更细一步的划分,值更大的显示在前面。
5、如果到Order in Layer值这里,大家也还都是一样的,则看在Hierarchy面板中,谁更在下面则更在前面显示。
6、总结:相机death值=>Camera值=>Sorting值=>Order in Layer值=>Hierarchy面板上下关系,层层比较,直到最终得出渲染顺序。
7、 其他情况目前,3D物体和UI的渲染顺序规则,此部分在本项目不了解也不影响。这里只说明的2D场景中SpriteRender的渲染顺序,其他的也是带SpriteRender同类性质的的组件都是一个道理的,比如还有Tile Map Render。
8、3D物体渲染顺序比较规则,其实3D物体,也差不多是同样的道理和流程的。首先如果是不同相机渲染的,那就先比较相机的渲染顺序。相机相同的情况向,比较Shader的渲染队列值。如果这些都相同,则比较世界空间下,大家的Z轴值大小。如果还是相同,则比较两者在Hierarchy面板中的上下关系。
9、 不管SpriteRender也好,3D物体也好,到目前也还没有UI渲染顺序相关的说明,好像还是不够全。
(1) UI的情况,会先比较Canvas,这时候可以完全把Canvas当做一种SpriteRender即可,比较顺序也是按照刚才SpriteRender那一套。最后完全按照Hierarchy面板中的顺序来进行排序,越往下,越在前面显示。另外有种特殊情况就是在代码中(类似SetAsLastSibling等api )也可以动态设置UI的渲染顺序。
(2)但是Canvas还有一个Render Mode参数,是可以打破刚才说的SpriteRender渲染模式的。画布的模式,三种Mode模式说明: - i. OverLay也叫UI模式,这时候UI永远在3D物体前面。UI完全按照UI的顺序规则,场景中物体按照3D物体和SpriteRender那套规则来排序。
- ii. UI Camera模式。UI有可能在前面,也可能在后面。首先不同相机则先取决于Camera的深度值,以及Canvas是否相同,不相同,开始比较Canvas的Sorting in Layer和Order in Layer,还相同Canvas的Z轴值,最后到Hierarchy上下关系。如果Canvas相同,就直接比较Hierarchy上下关系。
- iii. World Space模式,UI完全当成是一种3D物体,因此完全按照3D物体渲染顺序层级那套规则来排序。
10、另外要注意区分,物体渲染层级Sorting in Layer不要和物体的Layer混淆,前者是用做渲染顺序比较用,后者是在一些物理碰撞检查剔除,已经相机渲染剔除方面应用。