本节书摘来异步社区《Unity 3D NGUI 实战教程》一书中的第2章,第2.7节,作者: 高雪峰 责编: 张涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.7 深度(Depth)概念
Unity 3D NGUI 实战教程
2.7.1 强化对深度的理解
深度的概念将会一直伴随着UI的制作过程,是UI中一个非常重要的概念。我们在2.5.3小节中讲解UIPanel时已经讲解了深度的概念,这里我们再强化一下对深度的理解。在老版本的NGUI中,UI的显示层次关系是依靠z轴进行的。在新版本的NGUI中,所有UI的z轴都被统一,然后用深度来决定和管理显示的层次关系。关于深度,我们要记住一下关键点。
(1)每一个UIPanel和每一个UI控件都一定会有一个Depth,深度值大代表显示的优先级高(会越趋向于在界面更上层显示)。
(2)Depth决定的是UI的显示层级关系,一个UI控件是否显示在最上层是由它所属的Panel的Depth和它本身的Depth决定的。一般情况下,属于低Depth的Panel的控件,不管这个控件本身的Depth为多少,它都将显示在高Depth的Panel的控件后面(被高Depth的Panel遮住)。
(3)尽量不要让Panel之间共享同一个Depth,这样会导致性能消耗增加。
(4)制作Panel和UI控件时,记得考虑一下它所属的panel和它自身的Depth是否能让它显示在正确的层次关系上。
2.7.2 小心相机的深度
我们在场景中的每一个Camera也有一个渲染深度,如图2.36所示。
在前文中我们学习到NGUI创建时,都会创建一个它独有的相机。这个相机其实就是Unity中普通的Camera,然后为其附加了一个UICamera的组件。需要注意的是,所有的Camera也都有一个Depth,这个Depth会影响到UI中的Depth,特别是场景有多个Camera来渲染不同层次的UI时,这个影响会比较大。具体我们得遵循以下这些规律。
(1)相机的Depth永远是最高级的,也就是高Depth相机所看到的画面,永远在低Depth相机所看到的画面之上。
(2)如果需要相机有视觉穿透效果(只渲染所看到的东西,其他地方透掉显示其他相机所看到的画面),需要将相机的ClearFlags设置为DepthOnly。
(3)并不是只有负责渲染NGUI的相机的Depth会有影响,所有的相机(比如默认存在的渲染场景的MainCamera)的Depth都受此规律影响。例如,如果将照射UI的摄像机的深度设为0,然后将照射场景的相机深度设为1,那么,将看到场景把所有的UI遮住。
(4)创建UI时,UIRoot下生成的相机默认Depth是比场景中的相机深度高的,不过当场景内有多个摄像机时,一定要管理好每个摄像机的ClearFlags和Depth。
(5)当场景内有多个摄像机时,一定要检查摄像机的CullingMask不要渲染重复的Layer,否则可能导致显示双重画面。如图2.37所示,UI画面被两个相机同时看到,显示了两份(因为两个相机所在的位置不一样,所以看到的大小会不一样)。