主要解决问题是面板里含有3D模型,如果只有1个正交相机,3D模型的显示质量会很差。如果只用透视相机,UI会变形
NGUI官方的例子是使用2个UI Root,再创建一个Camera,把模型渲染到面片上。但这样有点复杂,并且对于移动平台消耗过高,也不适合一个面板一个prefab的形式
测试了一阵子,现在我个人比较好的解决方法是:只使用一个UI Root,UIRoot层级下包含2个Camera,Camera2D和Camera3D。3D相机的渲染深度比2D相机低一级。
分别用NGUI,NGUI3D两个Layer来标示渲染的物体。
这时可以把3D模型赋予NGUI 3D层,NGUI组件还是NGUI层。可以实现基本的2D,3D混合渲染,但这只支持非NGUI组件的3D对象
我简单标示了下:
UI Root
|-Camera2D(UICamera)
|-Camera3D(UICamera)
+-UIWidgets
+-Widget1(UIPanel, Layer:NGUI)
|-MySprite1(UISprite, Layer:NGUI)
|-My3DModel(Layer:NGUI3D)
|-Widget2(UIPanel)
如果需要3D UI,可以全部赋予3D层
NGUI有个问题,对于UI Sprite,UI Texture这些基本组件,一个UI Panel节点下只允许有一种层,即全部是NGUI或者NGUI 3D Layer的物体。如果赋予2种不同的会自动修复。
所以3D的 Sprite和2D的Sprite想共存实现不了,如果要实现必须放在不同的panel下面。就是需要改层级,会很麻烦,像下面这样:
UI Root
|-Camera2D(UICamera)
|-Camera3D(UICamera)
|-UIWidgets(Transform, Layer:Default)
+-Widget1(UIPanel, Layer:Default)
+-2DContentPanel(UIPanel, Layer:NGUI)
|-Sprite1(UISprite,Layer:NGUI)
|-Sprite2(UISprite,Layer:NGUI)
|-Sprite3(UISprite,Layer:NGUI)
+-3DContentPanel(UIPanel, Layer:NGUI3D)
|-Sprite1(UISprite,Layer:NGUI3D)
|-Sprite2(UISprite,Layer:NGUI3D)
|-Sprite3(UISprite,Layer:NGUI3D)
但需要的情况比较少,比如面板后面有一个大背景,这时候偷懒下就用Quad面片来代替,或者新建一个NGUI3D的UI Panel把UISprite放进去,而防止面板穿透的挡板照样存在于2D UI中,这样就不影响层叠使用
另外经过测试,UIPanel嵌套同样有效,就是NGUI层的panel下嵌套NGUI 3D的panel
这种方法对于层叠的UI同样没有问题。3D模型就是纯显示,不参与任何UI事件的接收。