首先明确的是,只要一个UI元素要展示出来,就一定需要一个Canvas组件,或者直接挂载,或者间接挂载,即挂在某个父节点上。那么这篇来说一说Canvas的3种Render Mode。
Canvas的渲染模式主要影响的就是显示的层级。每个模式下如何才能设置Canvas的层级更高一些,使得其优先于其他Canvas显示,视觉上的效果就是层级高的Canvas盖住了层级低的Canvas,这就是使用不同模式时需要考虑的问题。
换句话说就是,如果全局只存在一个Canvas,那么基本不需要面对这个问题,直接根据节点的顺序即可知道显示的层级。但实际的需求中,会有各种层级交错问题,甚至还需要动态调整层级以满足独特的显示需求。
1. Screen Space - Camera
先说这个选项最多的模式。这个模式需要指定一个摄像机,一般使用场景Scene里默认的相机即可,除此之外,还有几个关键参数:
- Plane Distance
- Sorting Layer
- Order in Layer
我们的摄像机和Canvas是存在于一个3D立体的世界场景中,而Plane Distance指的就是Canvas这个二维平面距离摄像机的距离,挂载Canvas的GameObject的Z坐标就会受到这个值的控制,值越小则距离摄像机越近,而Z坐标的值要具体看摄像机的Z坐标和Plane Distance,关系如下:
1 | 摄像机Z坐标 + Plane Distance = Canvas Z坐标 |
如果在Canvas和摄像机中间存在3D物体,那么3D物体也会显示在摄像机中。
而Sorting Layer则是把所有的Canvas分成几个固定的层,默认情况只有一个叫做Default的层,可以手动按需添加,下面的层的层级更高,也就是说下面层的Canvas的元素会显示在上面的层的Canvas上面。
在同一个层内,就要通过Order in Layer来控制渲染顺序,值大的会盖住值小的Canvas。
所以,要想让一个Canvas1优先于Canvas2渲染显示,那么就需要让1的Sorting Layer大于2;如果二者的相等,那么就要让1的Order in Layer的值大于2;如果二者还是相等,还可以调整Plane Distance。
2. Screen Space - Overlay
如果明白了上面的Camera模式,这个就很好理解了。Overlay可以理解成一个删减版的Camera,这个Overlay的意思是覆盖,盖住的是世界场景中的其他3D物体,也就是说,即便Canvas和摄像机之间有没有3D物体,也不会遮挡Canvas。
这个模式的Canvas始终贴着屏幕显示,其他的都会被覆盖,这也正是凸显了Overlay这个词。
这个模式也去掉了Sorting Layer,只剩下一个Sort Order,也就是意味着不需要分层,所有的Overlay都在同一层,然后按照Sort Order排序、渲染。
3. World Space
这个模式下,Canvas与其他3D物体没有区别。