第一:UGUI中:
一、条件:Render Mode都是Screen Space-Camera时的渲染顺序
1.遵循刷油漆规则
2.依次由Render Camera的Depth值、Sorting Layer先后顺序、Order in Layer值决定
Render Camera不同时,由Render Camera的Depth决定
Render Camera相同时,由Sorting Layer先后顺序决定
Render Camera相同时,Sorting Layer相同,由Order in Layer值决定。
二、1.OverLay模式,永远覆盖在其他物体之上。出现在最上面。不受摄像机的Depth值影响。
2.有多个摄像机时,由摄像机的Depth值决定
3.只有一个摄像机时,由距离和方向决定World模式和Camera模式、它们的渲染结果 可前、可后、可穿插。
三、条件:同一个Canvas下,UI对象在Hierarchy窗口中越往上越先渲染,越往下越后渲染。
第二:所有的渲染:
Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth低的相机下的物体,再绘制depth高的相机下的物体,也就是说,depth高的相机会覆盖depth低的相机(具体的覆盖关系有don't clear, solid color等等几种)
比Camera层稍低一层的是sorting layer层, 随便找一个可以设置sorting layer的地方,选择sorting layer,点添加按钮,就可以看到当前所有的sorting layer,并且可以更改sorting layer的顺序,排位靠后的sorting layer会覆盖排位靠前的sorting layer。 设置好sorting layer的相互关系之后,就可以给任何一个继承于Renderer类,或者有renderer的子类作为field的对象设置sorting layer了。 注意这些sorting layer的遮挡关系是在同一个camera的层级下的。 不同camera下的renderer渲染顺序以camera的depth为准。 有的component的sorting layer可以直接在unity editor里面设置,比如Sprite Renderer。 有的则需要用代码来设置,比如设置Particle system的sorting layer, 就需要在代码中取到 ParticleSystem.Renderer.SortingLayer 来进行设置。
比sorting layer再低一层的是sorting order, 这个数字指代的是在同一个sorting layer下的渲染顺序,用法很明显就不赘述了。
需要注意不要混淆的是gameobject的layer,和renderer的sorting layer。 gameObject的layer个人理解是一个逻辑上的分层,用于camera的culling mask等。 而renderer的sorting layer则用于渲染。只有继承与renderer或者有renderer作为filed的component才需要设置sorting layer。
另外需要指出的是,常用的NGUI的widget depth其本质也是一个sorting layer下的sorting order。 NGUI好像用的是一个叫做“UI"的sorting layer。 由此大家如果有需要,也可以自己取Hack NGUI的代码,把NGUI的sorting layer暴露出来供自己定制。
简单总结一下,决定Unity渲染关系的层级顺序是:
Camera //在不同的Camera中,渲染顺序由Depth决定,depth值越低,越先渲染,值越高,
越后渲染。
sorting layer //在相同的Camera下,越在上层,越先渲染,越在下层,越后渲染。
sorting order //在相同的 sorting layer下,值越小,越先渲染,值越大,越后渲染。