zoukankan      html  css  js  c++  java
  • Unity3d UI与逻辑分离改造

    最近整理UI改造的问题,我们在项目设计初期没有考虑到UI与逻辑的分离导致动态更新不能进行,现在项目的UI量已经上升到了二百多个,如果重新做一遍UI工作量太大(主要是重复工作量),让人无法接受,所以试着能不能使用程序处理一部分,减少点工作量。

    第一步 整理代码。以前的代码格式不太规范,我的想法是把UI脚本与逻辑脚本对接起来,比如UI脚本的名字是UIBlood, 它对应的逻辑脚本的名字就是UIBloodWin。所有的逻辑脚本放到同一个目录下,使用**Win进行重命名。把和UI相关的脚本分为UI脚本,逻辑脚本,组件脚本(UIComponent),插件脚本(UIPlugin),分别放到不同的目录下:UIScript, Windows, UIComponent, UIPlugin。

    第二步 UI脚本生成。我们每个UI都对应一个独立的prefab, 第一步的UI改造已经完成了一部分,这一步要把逻辑脚本中的UI部分抽离出来,生成UI脚本。这一步不细说,一般的程序员都能想到。程序自动生成的UI脚本并不完全,有一些组件不能自动生成,需要手动检查脚本,这一步自动化较难实现。下一步要把UI脚本挂到prefab上。

    第三步 改造prefab。这一步是关键部分,把上一步生成的UI脚本使用程序自动挂到每一个prefab上,然后把原来的Component上的UI控件的值复制到现在的UI脚本上,然后销毁原来的Component,这样就达到了只留下UI部分的目的。比如:一个叫做Blood的prefab,上面挂了一个UIBloodWin的脚本,现在我们要把UIBlood的挂到Blood上,然后把UIBloodWin上的UI控件的值复制到UIBlood中,最后销毁UIBloodWin。

    第四步 重新存回。这一步好像可以使用自动化实现,我没有找到方法,自己一个个拽回去的。

    脚本分离后的实验

    1. 单独加载测试。见到有些游戏使用这种方法,我们也尝试一下,在之前的工程里所有的UI是放到一个UI场景中加载的,这次实验把场景清空了,在加载完UI场景后,把所有的UI部分逐个加载到场景中(使用AssetBundle的形式)。在PC上的测试结果是12~13秒,而之前的方式加载时间不到五秒

    2. 找包测试。把所有的UI打包成一个AssetBundle进行加载,加载时间与第一步相同,怀疑这部分时间消耗在实例化对象上了。

    3. 使用UI场景测试。现在贴图,字体,声音已经从UI中分别了出来,把所有的UI打成一个包的容量并不大,这次仍使用UI场景加载,把UI加到场景中,集体打包。程序初始化完成后,加载UI场景,这次加载的时间缩短到了五秒钟。

    4. 不使用UnityEngine.Object.Instantiate(obj)实例化对象,加载时间缩短到五秒,但UI不能正常显示,在场景中游戏对象被激活的情况下,看不到界面,原因不明。

    考虑到工作量的问题,决定先不在版本上进行修改

  • 相关阅读:
    vim 多窗口编辑
    opengl笔记——旋转,一段代码的理解
    用条件变量实现事件等待器的正确与错误做法
    opengl笔记—— glMultMatrixf() 区别 glLoadMatrixf()
    Mule与其它web应用服务器的区别
    海量数据相似度计算之simhash短文本查找
    关于协方差矩阵的理解
    C++ STL中的常用容器浅谈
    唐-诗:《枫桥夜泊》
    唐-诗:《肚桑干》
  • 原文地址:https://www.cnblogs.com/longay/p/3963795.html
Copyright © 2011-2022 走看看