当前位置:网站首页 > 技术博客 > 正文

unity图形引擎开发



在正式开始转换之前呢,先大概说说NGUI跟UGUI的一些基本情况。

UGUI 是 Unity 4.6 版本后引入的 UI 系统,它采用了基于 Canvas 的渲染方式,提供了更加直观和易用的 UI 设计界面,同时也支持多分辨率自适应、动画效果等高级特性。UGUI 的设计理念与 Unity 引擎紧密结合,具有很好的兼容性和扩展性。而且UGUI是Unity官方推荐的UI系统,自家的娃会长期支持维护,因此在项目长期发展过程中,建议使用UGUI进行开发。

NGUI和UGUI是两个不同的UI系统,它们的实现方式不同,因此将NGUI转换为UGUI的时候需要做一定的调整和修改,大概归纳有以下几点调整:

总之,将NGUI转换为UGUI,就是将NGUI的UI层次结构,元素组件逐一转换到UGUI的组件元素,并用NGUI元素组件的属性(如位置,大小)设置给UGUI的组件。对于自定义的脚本,事件处理,自定义的组件则需要手动处理。

因为NGUI与UGUI的架构跟组件差异较大,所以从NGUI项目转换到UGUI项目的耗费成本不低。具体可以按照这么一些步骤来完成转换

2. 核心转换类定义,AtlasConverter、UIButtonConverter、UIFontConverter、UIToggleConverter、UIInputConverter、UIPanelConverter、UISpriteConverter、UIWidgetConverter、UISliderConverter、UIScrollViewConverter、UIGridConverter等。

3. UI节点以及子节点的递归获取,要想转换UI,需要收集到所有带转换的UI组件

通过这个方法去递归获取到所有的UI组件节点。

4. 得到所有的UI组件节点,再通过节点对象获取到节点对象上挂在的组件(component)

在获取组件的时候,首先是用常规的方法,GameObject.GetComponent去获取。如果失败再尝试使用组件的名字通过反射得到组件的Type,然后再通过Type去尝试获取组件。

这是反射指定类型核心函数。

5. 拿到了待转换UI的所有组件后,进行遍历。每个组件类型都通过重写NeedConvert方法来判定是否需要转换,如果需要转换再调用该类型组件重写的OnConvert函数,来进行自身组件的转换,如Label的转换:

这一步将NGUI的Label转换成UGUI的Text

通过反射的方式拿到NGUI组件跟UGUI组件的所有字段跟属性,然后比较赋值。完成NGUI组件到UGUI组件的转换。

7. 通过递归遍历需要转换的NGUI UI Prefab,对每一个组件调用对应的转换函数进行转换

3. NGUI与UGUI组件属性字段拷贝过程增加对属性跟字段值的判断,实际转换过程会有为null或者“null”的属性值,需要特殊处理,不然转换会失败。引起的原因有

5. 转换过程如果组件上挂在的脚本有依赖关系会导致删除原始组件失败,从而导致转换失败,这个时候需要手动删除再添加对应的UGUI组件。比如:Can't remove UIPanel (Script) because TweenPanel (Script) depends on it 因为TweenPanel脚本实现依赖的UIPanel,所以在移除UIPanel的时候会报错,有别的脚本依赖他。就需要手动去处理下。

6. 图集转换过程中,因为是使用了工具目录下的资源路径,但是实际上资源是在项目目录下,会导致纹理资源找不到。增加处理逻辑,将NGUI的资源拷贝一份到工具目录下。

7. 获取图集图片路径增加支持*.gif,*.psd,*.bmp, *.jpeg文件类型(正常情况下项目中不会有)

8. 在特别复杂的prefab转换过程,子节点很深很多的时候,在递归子节点,通过反射类型递归子节点的数据特别多会造成转换过程无响应。比如这类的界面转换时间特别久

9. Scrollview的转换逻辑过程中,会出现ScrollRect组件添加失败的情况,需要增加判断,如果AddComponent失败了可以尝试GetComponent方法去赋值。进行简单的判空操作会导致转换逻辑跳过而导致部分UI无法正常转换。修改代码如下:

将每次都获取的内容缓存起来,减少不必要的调用次数,劲儿达到减少消耗。

11. 处理过程增加进度条显示,不至于在转换复杂的UI时不知道是卡死还是在转换,看不到进度提示。

12. 优化获取所有子节点的函数,将原来的递归调用方式获取修改为栈方式,在存在大量子节点的时候递归调用非常耗时,改为栈的形式,几乎能秒查找完,不会卡主

使用工具可以快速的将NGUI的项目转换成UGUI项目,可以批量复用NGUI的UI,能节约大量的时间去拼接UI。但是因为UI的复杂性跟不确定性,转换以后还需要做相当细致的验证,还需要对应的前端程序配合才能更好的完成。

欢迎加入我们!

感兴趣的同学可以投递简历至:

  • 上一篇: leaf spine网络架构
  • 下一篇: fork函数的作用
  • 版权声明


    相关文章:

  • leaf spine网络架构2025-07-28 23:01:03
  • usb接口的驱动怎么安装2025-07-28 23:01:03
  • 深度优先遍历怎么遍历2025-07-28 23:01:03
  • csdn积分能换钱吗2025-07-28 23:01:03
  • juc java并发2025-07-28 23:01:03
  • fork函数的作用2025-07-28 23:01:03
  • mysql函数nvl2025-07-28 23:01:03
  • matlab求和∑函数例题2025-07-28 23:01:03
  • 路由交换技术基础知识2025-07-28 23:01:03
  • java中抽象类是什么2025-07-28 23:01:03