NGUI 2DCamera和3DCamera共存的解决方案

主要解决问题是面板里含有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事件的接收。

你可能感兴趣的:(Camera)