2.6 2DUI和3DUI的工作原理
2.6.1 2DUI的工作原理
先创建一个2DUI(创建方法上文已讲过),然后在2DUI的“根”UIRoot下创建两个精灵(创建方法后面会详解)。然后得到的效果如图2.32所示。
▲图2.32
从图2.32中可以看到,创建的两个Sprite为两个按钮图片,它们的位置在UIRoot的红框(视窗)上,也就是Sprite的z轴、相机的z轴、UIRoot的z轴都为0,因为2DUI都是纯粹的2D图片按层次显示,不会出现三维立体效果,所以都是直接紧贴着视窗,只要UI控件在UIRoot的红框范围内,那么UI就能够正常显示在Game上。在Game视图中,我们看到的景象如图2.33所示。
2DUI最本质的意义是:UI摄像机是一个正交摄像机。
▲图2.33
2.6.2 3DUI的工作原理
同上2.6.1小节一样,先创建一个3DUI,然后在“根”下面创建两个Sprite,得到如图2.34所示的景象。
▲图2.34
从图2.34中可以看到,在3DUI下,创建的UI控件都在一个三维立体空间中,摄像机是一个透视的摄像机,这和2DUI有着截然不同的区别,因为2DUI是一个正交摄像机。
3DUI中UIRoot的坐标点如图2.34所示,是在三维空间的一个点上,这个位置是创建UI时自动定义好的,以后创建的UI控件都会自动地在这个点所在的面上生成(自动统一到UIRoot的z轴,因为Sprite属于UIRoot的子物体),所以图2.34中UIRoot根物体和两个创建的Sprite的z轴都为0,而Camera的z轴为-700。
我们在图2.34生成的两个Sprite用3DUI做出的效果,在Game视图里看,和2DUI几乎是一模一样的,如图2.35所示。
但是需要注意的是,如果需要将2DUI改为3DUI,不是简单地将摄像机改为透视模式就行了,在NGUI 3.6.0 以后的某些版本中,这样会导致看不到任何UI控件(这些版本的2DUI的控件和Camera、UIRoot三者在同一个z轴面上,而变成3D摄像机后是看不到和摄像机同z轴的物体),如果将3DUI的摄像机直接改为正交模式,也并不能简单地变成2DUI,因为正交相机的Size并不和NGUI默认的值一样。所以,在进行UI开发时,最好先思考一下将要使用2D还是3DUI更好。
▲图2.35
2.6.3 如何判断该选择哪一种UI
上文中我们讲解了2DUI和3DUI的原理,那么在实际的项目开发中,如何来判断应该使用哪一种UI呢?有以下一些规律可以参考。
(1)新版本的NGUI对3DUI支持很好,如果3DUI和2DUI选择哪一个都行的情况下,建议选择3DUI,扩展性更强。
(2)如果出现 UI 不允许有远近透视的大小变化,必须选择 2DUI。例如,角色头顶的血条,在人物跑远了之后如果血条并不会变小,这时血条就必须用2DUI做。
(3)如果要出现UI有三维变换的效果,例如,由远及近的变大、三维旋转等,就必须用3DUI。
(4)无法明确知道应该用哪一种UI的情况下,建议选用3DUI。
(5)不论用哪一种UI,其实本质上只是一个摄像机的区别,基本上都能实现UI效果,只是需要的处理不一样,所以,如果选择错了UI模式也不用太着急,总有很多办法来解决的。