Unity NGUI和UGUI与模型、特效的层级关系

本文详细探讨了Unity中的GUI框架,包括Unity自带的GUI、UGUI、NGUI和FairyGUI。重点讲解了如何控制渲染顺序,如通过Camera的depth、sortingLayer和sortingOrder、RenderQueue等方法。同时,针对模型和粒子特效的渲染层级控制,文章给出了多种解决方案,如使用多相机、RenderQueue和Sorting Order等,旨在解决UI界面穿插和层级混乱的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本篇文章是整理在做项目的过程中,遇到了各种各样的界面穿插问题,以及界面层级混乱,比如,手机卡了或点快了,就导致两个界面相互交叉。

这里有个unity学习交流小组

对于界面,这应该算是一个很严重的bug,很大部分原因是整个UI框架没有从整体上考虑这个,后来决心弄清楚层级的控制,并把一些对于目前项目可行的方法应用,界面穿插的问题少了很多,注意我只是在现有的框架打的补丁。如果是一个从头开始,在架构UI的时候,希望这篇文章能够帮到你们。

以前项目使用的NGUI插件,UI是有一个人摆放的,我们客户端就拿到这些prefab,添加相应的逻辑脚本。但恰恰是这个摆界面的人也没有注意界面的层级,各个panel、各个widget的depth没有统一管理,导致开发中后期,界面一多起来,很多界面同时出现的时候,panel和widget的层级就乱了。

Unity有哪些GUI框架

1. unity自带的GUI系统

一般都不用它来开发游戏,作为拓展unity编辑器开发比较多,unity自带的GUI效率非常低,每次渲染都是一个DrawCall,不好用,不能做到所见即所得。

2. unity4.6之后的UGUI

UGUI是NGUI作者参与开发的,unity官方的新UI系统,感觉挺好用的,至于效率问题应该比NGUI好些。5.x以后ugui有很大的提升,以后ugui应该会逐步替代ngui。

很早之前就尝试过这套ugui系统,正是我在研究界面层级的时候,用NGUI显示模型粒子特效没有找到好的方法时,于是探索了ugui,具体怎么控制层级,后面会讨论。

3. NGUI

是一个老牌的unity UI插件了,在ugui没有推出之前,大部分unity的游戏都使用的NGUI插件开发UI,它的好处很多,提供了常见的UI控件,实现几乎所有需要的功能,在效率上也是控制严谨,DrawCall合并极大提升了控件渲染效率,还支持3D GUI。但是也有很多不足,版本更新太频繁,版本bug很多,对于了解NGUI的开发者可以很好利用它,但对于初学者来说,NGUI固然容易上手好用,但是对DrawCall的重建规则不了解,仍然会效率低下(后面会整理一下分析NGUI的笔记)。

4. FairyGUI

最近发现的一款跨平台UI编辑器,组合各种复杂UI组件,以及为UI设计动画效果,无需编写代码,可以一键导出Unity,Starling,Egret, LayaAir,Flash等多个主流应用和游戏平台。

特性:

  • 所见即所得。操作简易,使用习惯与Adobe系列软件保持一致,美术设计师可以轻松上手。
  • 在编辑器即可组合各种复杂UI组件,无需编写代码。不需要程序员编码扩展UI组件。
  • 强大的文本控件。支持动态字体,位图字体,以及BMFont制作的位图字体,支持HTML语法和UBB语法,支持图文混排。
  • 强大的列表控件,支持多种布局,支持虚拟列表和循环列表,即使列表项目数量巨大也拒绝卡顿。
  • 支持图片的九宫格和平铺处理,支持图片变色和灰度,支持序列帧动画编辑和使用。
  • 内置手势支持。
  • 提供时间轴设计UI动效,可实时看到每帧的位置或其他效果。
  • 编辑状态下使用分散的素材,发布时自动打包图集。支持定义多个图集,自动支持抽出A通道的压缩方式。
  • 多国语言支持。
  • 各种分辨率自适应。
  • 提供插件机制,可以根据项目的需要为编辑器加入个性功能。
  • 为各个游戏平台提供了一致的API,得益于编辑器强大的编辑功能,程序员只需要了解少量API就能完成UI展现,相比Feathers, NGUI, UGUI等UI框架,FairyGUI提高了UI制作效率,降低了成本。

当然不止这些,还有许多UI框架,比如:Daikon Forge GUI、EZ GUI、2dTookit等等,有时间可以看看,但目前主要用到的还是NGUI、UGUI啦。

为什么要关心渲染顺序?

1. 如果是2D游戏,渲染顺序关系着每个层次的显示先后,比如UI在游戏内容前面,游戏内容又有多层次。举一个简单的例子,在横版2D游戏中,经常会用到多层滚动的背景,把游戏物体分层管理起来,可以有效的减少出错几率,很好的控制显示效果。

2. 对于3D游戏,游戏内容是3D的,UI一般是2D,有很多时候需要把某个模型啊,粒子特效啊,放在界面上,这样就有一个问题,3D物体和2D界面的先后关系,比如有些界面是在模型之上的,有些在下面,尝试过很多种办法,都能实现需求,但不是每种办法都是那么舒服的。

unity中控制渲染顺序的方式

1. Camera

Camera是unity中最优先的渲染顺序控制。depth越大,渲染顺序越靠后。

<think>嗯,用户想了解NGUIUGUI在调用方式上的区别,也就是调用机制上的差异。首先,我需要回忆一下这两个UI系统的背景。NGUIUnity早期的第三方插件,后来Unity官方推出了UGUI作为内置解决方案。用户可能是在项目升级或者技术选型时遇到这个问题,需要比较两者的不同之处。 首先,调用方式的不同可能涉及组件结构、渲染流程、事件处理等方面。比如,NGUI主要依赖UIPanelUIWidget,而UGUI使用CanvasGraphic类。我需要从这些基础组件入手,比较它们的调用机制。例如,创建UI元素时,NGUI可能需要手动管理图集深度,而UGUI自动处理这些,调用方式会更简洁。 然后,事件处理机制也很重要。NGUI使用ColliderSendMessage,而UGUI基于EventSystemRaycaster,可能需要不同的代码写法。比如,UGUI需要添加EventTrigger组件或者实现接口,而NGUI可能直接在脚本里监听OnClick事件。 另外,性能优化方面,UGUI的合批机制Canvas分层可能影响调用方式。比如,频繁改变UI元素时,UGUI的合批策略可能导致不同的性能表现,需要调用Rebuild方法或者合理设置Canvas。而NGUI可能需要手动调整Depth或处理Draw Call。 还有,动态创建UI元素的部分,两者的实例化方式可能有差异。UGUI倾向于使用预制体RectTransform,而NGUI可能需要更多手动调整位置大小。引用中的例子,比如SetActive导致NGUIUIPanel重建,而UGUI的Canvas会标记为脏区域,延迟处理,这也是调用机制的不同。 用户可能还关心在实际开发中如何选择,比如项目类型、团队经验、性能需求等。需要结合引用中的信息,比如转换工具的存在,但转换后需要细致验证,说明两者在底层机制上的差异较大,调用方式改动可能较多。 最后,要确保回答结构清晰,分点比较,并给出相关问题引用来源。可能需要检查每个差异点是否有引用支持,比如NGUI的DepthUGUI的Sorting Layer,引用5提到NGUI的DC范围问题,而UGUI的合批策略在引用3中涉及性能优化。</think>### NGUI vs UGUI 调用机制差异分析 #### 1. **组件调用基础结构** - **NGUI**:依赖`UIPanel``UIWidget`组件树。每个UI元素需手动设置`Depth`值控制层级,通过`UIPanel`管理合批规则。例如: ```csharp UISprite sprite = gameObject.AddComponent<UISprite>(); sprite.depth = 10; // 显式控制渲染顺序 ``` 当元素状态变化时(如`SetActive(false)`),NGUI会触发`UIPanel`重建[^5]。 - **UGUI**:基于`Canvas``Graphic`类,层级通过`Sorting Layer``Order in Layer`控制。例如: ```csharp Image image = gameObject.AddComponent<Image>(); Canvas.SetSortingOrder(image.canvas, 5); // 通过Canvas层级管理 ``` UGUI采用自动合批策略,仅在`Canvas`标记为脏时重新计算布局[^1]。 #### 2. **事件响应机制** - **NGUI**:依赖`Collider`组件`SendMessage`: ```csharp UIButton btn = GetComponent<UIButton>(); btn.onClick.Add(new EventDelegate(OnButtonClick)); ``` 需要手动挂载`BoxCollider`,事件穿透需自行处理。 - **UGUI**:基于`EventSystem``GraphicRaycaster`: ```csharp Button btn = GetComponent<Button>(); btn.onClick.AddListener(OnButtonClick); ``` 支持多层级事件拦截,可通过`EventTrigger`组件扩展交互类型。 #### 3. **动态UI创建性能** - **NGUI**:动态添加元素会立即触发`UIPanel.RebuildAll()`,导致CPU峰值。例如: ```csharp UIPanel panel = GetComponent<UIPanel>(); panel.Refresh(); // 强制重建 ``` 高频操作易引发性能问题。 - **UGUI**:采用延迟更新策略,通过`Canvas.UpdateBatch`在帧末批量处理: ```csharp Canvas.ForceUpdateCanvases(); // 手动触发合批 ``` 适合高频更新场景,但需注意`Canvas`分层策略[^3]。 #### 4. **渲染流程对比** - **NGUI**:基于`OnFill`虚方法逐Widget生成顶点数据,合并相同图集的DrawCall。深度值冲突会导致意外合批中断。 - **UGUI**:通过`CanvasRenderer`将Graphic数据提交给底层渲染器,采用`Depth-first`遍历排序,支持MaskRectMask2D优化裁剪。 #### 5. **实践选择建议 | 维度 | NGUI | UGUI | |------------|---------------------------|-------------------------------| | 维护成本 | 需手动管理Depth/Atlas | 自动合批+官方工具链 | | 性能临界点 | 500+元素时明显卡顿 | 1000+元素仍可保持流畅 | | 平台适配 | 需自行处理Retina适配 | 原生支持多分辨率响应式布局 | | 扩展性 | 依赖第三方插件扩展功能 | 官方持续更新+ShaderGraph集成 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值