本文共 2175 字,大约阅读时间需要 7 分钟。
今天为了研究热更,抽空把的文档研究了下。当然自己的项目中也用到了x_lua,所以做些笔记。
基于MVC设计模式,其中Model层为UI界面数据,是游戏逻辑数据的子集,此外,还可以带窗口的控制数据,如果一个窗口不需要这些数据,不需要写Model层脚本;Ctrl层为窗口控制侧,窗口界面的控制直接写到View层,这里说的控制意思是把窗口当做一个输入接口,对游戏逻辑执行的控制,同样,不需要控制层的窗口不写就好;View层为窗口视图逻辑,负责界面刷新逻辑。
工作流程:
当请求UI管理器打开窗口时,UI管理器会根据UI配置找到MVC各层脚本文件并实例化对象,生成一个UIWindow的数据结构标识一个窗口。立刻调度Model层OnEnable(首次打开先调用OnCreate),如果有传入参数,需要在此处保存下来;随后等待UI资源异步加载完毕,加载完毕后调度View层OnEnable(同样首次打开先调用OnCreate),View层随后实现类似Mono脚本的调度流程,View层可以随时读取Model层数据,但是写Model层数据需要经过Ctrl层;Ctrl层无状态,如果需要状态,写Model层就好。
脚本调度顺序:
OnCreate->OnEnable->Update->LateUpdate->OnDisable->OnDestroy
注意:Update相关函数添加上就会被调度,尽量不用,节省性能。界面逻辑书写流程和写Mono脚本大概一致。
数据流:
层级管理:
所有UI挂载在UIRoot下面,UI划分的渲染层级是UI层,现在针对游戏一共预设了5个层级:Default、Map、Scene、Character、UI。目前UI排在最顶层,如果各个层级管理不出现问题,那么高层级的对象总是会盖住低层级的对象。
UI层级下的所有窗口根据OderInLayer的值来前后排布,为了避免层级混乱,这里进行统一管理,划分了一个子层级的概念,专供UI使用:
目前一共划分了6个子层级,第一个LuanchLayer只在启动界面使用;其余的子层级从上到下,展示时依次从背面到前面。
归属于下一个子层级的UI窗口总是会盖住上一个子层级的UI窗口,不管打开顺序如何;而归属于同一个子层级的多个UI,其层级关系由打开的先后顺序决定,后打开的UI总是会盖住先打开的UI。
每两个相连子层级之间的OrderInLayer相间1000,而相同子层级的相连窗口OrderInLayer相间10,意思是说每个子层级最多可以同时打开100个窗口;而窗口内部还可以各自划分10个层级来使用,用于各个UI组件之间的层次关系(这些数值都可以根据具体情况调整配置)。在UGUI中,同属于同一个OrderInLayer的UI组件也可以排布先后,这种先后关系通过Hierarchy中的上下次序来决定,所以建议优先通过这种方式来排布先后,如果不能满足需求,再来使用不同的OrderInLayer来排布(会增加drawcall)。
补充记录
一般的UI框架都会把数据与显示分离,如果更详细的话,也可以将控制的逻辑单独提炼出来。
层级划分根据自己项目需要,名字和作用不一定要与文档一直
可以使用观察者模式,用代码回调的方法来刷新界面,尽量避免显示对于update更新函数的占用。
今天就先到这儿,基本思路和之前设计区别不大。我的项目中用的是自己的框架,所以就不再追叙。接下来的资源管理模块涉及到热更,是研究的热点,等明天再研究。
----------------------2020.9.28----------------------
转载地址:http://sowli.baihongyu.com/