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事件的接收。

时间: 2024-10-15 11:13:01

NGUI 2DCamera和3DCamera共存的解决方案的相关文章

Python/Anaconda多版本共存的解决方案

博客中的文章均为 meelo 原创,请务必以链接形式注明 本文地址 虽然Python2大势已去,众多项目都已经支持Python3,但总有一些教程和项目只支持Python2.通常情况是计算机里既装着Python2,也装了Python3. 多Python版本共存的解决方案已经有不少,简单罗列几种: 直接修改程序文件名 借助pyenv和virtualenv 借助conda环境 使用Python Launcher 这些方法都有各自的不足,直接修改程序文件名仍然不能解决pip包管理器的问题,对jupyte

设置IIS服务器监听特定IP的特定端口(IIS与IHS或Apache共存的解决方案)

在灾难恢复的试验中,遇到了一个IIS无法启动的情况,会报如下的错误: "The network location cannot be reached, xxxxxx" 要知道,Windows报的这种弹窗错误,也只能通过Windows自带的事件管理器里查看了.直接运行:eventvwr,打开SYSTEM项,一个大大的错误映入眼帘: 所以错误就很明显了,没有把我们的新地址添加到监听列表里... 根据搜索,发现仅仅用IIS的图形界面工具,似乎无法让IIS去监听某一个IP地址的某个端口,必须要

Unity3D NGUI 点击穿透问题的解决方案

当3D场景和NGUI共存时, 点击上方的UI层按钮, 下方的3D物体也会触发OnMouseDown事件, 而有时这是我们所不希望的. 解决方案: 如果3D场景中的物体只需要点击等简单的操作, 那么可以将2D/3D镜头的UI Camera组件的EventType属性分别设为UI/World, 来将3D物体和UI的点击事件分开. 1.为主摄像机添加UI Camera组件, 并将EventType设为World 2.将3D场景中需要添加点击的物体, 添加UIButton属性(NGUI-Attach-B

【基础】Unity中背景、3D object、NGUI控件共存

大部分U3D的游戏开发中都需要用NGUI这款界面控件,NGUI如何和3D物体共存是刚使用U3D时最常问的问题. 笔者在当前的项目中还需要加入一个背景图片,因此这里将方法统一讲一下,层次结构需求是:背景图片(底)——3D物体(中)——NGUI控件(顶) 以下是过程: 1.先来考虑3D物体和NGUI的共存,那么首先New一个场景 2.先不管Main Camera,我们来设置NGUI部分,Create一个2D UI,再拖一个NGUI的Button进去. Create一个Cube表示场景中的3D物体,为

unity 2d 和 NGUI layer

http://blog.csdn.net/xtxy/article/details/37876825 在使用unity2d开发游戏的时候,使用了NGUI作为界面,本来二者配合得还挺好,但是一个使用场景出现了问题,就是一个ngui的sprite需要放置在unity2d sprite后面显示,也就是用ngui得sprite作为背景,结果发现替换sprite的altas的时候,背景就把unity2d sprite遮挡住了,使用z轴控制不住. 在网上搜索了一下,发现了NGUI适应unity 2d lay

ros rviz: Segmentation fault (core dumped) 与 [rviz -1] process has died [pid 10134, exit code -6]

1. 执行roslaunch 文件打开 某rviz文件.出现了例如以下的错误: [rviz-1] process has died [pid 10134, exit code -6] 2. 执行rosrun rviz rviz  正常,执行某公布图像的节点, 当用rviz加入 这一图像topic时,出现了例如以下的错误: Segmentation fault (core dumped) 我的问题出自解决问题QTerro:Size mismatch for type 'QPaintBufferCa

IE8“开发人员工具”使用详解上(各级菜单详解)

来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各级菜单详解) IE8正式版已经发布了.本篇文章不会非常扯蛋地去进行什么评测,然后给出什么“Chrome运行JavaScript能力是IE8的15倍”.什么“IE8页面渲染速度是Safari的2.456倍”.什么“IE8的抗强暴能力比FireFox高出1.235倍” 这样的操蛋的结论.我管谁比谁强多少

unity UI置灰(转载)

Unity3D开发(二):NGUI之UIButton"禁用"状态时置灰 分类: Unity3D开发2013-09-30 18:51 7024人阅读 评论(5) 收藏 举报 目录(?)[+] NGUI中的Button几乎是最常用到的控件之一,并且可以组合各种组件(比如UIButtonColor,UIButtonOffset,UITweenxx),方便设置Button的各种状态下的属性,几乎可以满足我们的所有需求. 但是对于当Button的isEnabled属性设置为false时,根据设置

一个Windows系统下同时安装Python2和Python3

一.Python下载    - Python的官网 https://www.python.org/ 下载Python的安装文件    - 对于Windows用户来说,如果是32位系统,则选择x86版本    - 如果是64位系统,则选择64版本的安装文件.    # python-2.7.12.amd64.exe    # python-3.5.0-amd64.exe 二.Python3安装    - 推荐安装路径为C:\Python35,注意:路径最好无空格    - Python3在安装时可