最近整理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不能正常显示,在场景中游戏对象被激活的情况下,看不到界面,原因不明。
考虑到工作量的问题,决定先不在版本上进行修改