【Unity/GameFramework】Start Force ——配置和表加载
文章目录
- 前言
- 寻找流程
- 具体加载
- 配置加载:
- 获取路径:
- 添加到标志数组:
- 进行实际加载:
- 数据表加载:
- 获取路径:
- 添加到标志数组:
- 进行实际加载:
- 语言加载:
- 字体加载:
前言
首先思考如果不使用框架,那么我们大概率会专门包装做一个Json或者XML工具类,然后实现序列化和反序列化的方法,利用第三方库来对指定路径的文件进行具体序列化反序列化操作。在外部使用时,传入路径,指定类型,即可返回需要的对象。如果是和GameFramework一样做配置使用,那么我们就不仅仅只是序列化出来再交出去。我们还可以做一个类专门存储这一类反序列化出来的配置对象。并指定在某个时机(如初始化,游戏资源加载流程)来让其将所有配置统统反序列化出来,并向外暴露接口来访问这些反序列化的配置对象。
如此一来,就十分接近GameFramework中的配置资源管理了。
寻找流程
首先,如果要加载一个文本文件,并将其反序列化,我们需要先知道其路径,并找到文件。为了快速调试GameFramework加载表的这一过程,我们直接将文件夹下的DataTables给改名成DataTable,路径一旦改变,涉及到加载表的过程就一定会失败,在Unity的错误堆栈上我们可以快速大致预览一下这个行为发生在什么地方。
中间可以注意到ProcedurePreload,即该操作发生在预加载阶段,进入该流程可知,该流程负责加载配置,数据表,语言,文本。这四个加载分别对应不同的组件。
具体加载
找到加载的函数后,按顺序分析一下:
配置加载:
获取路径:
框架在将文件内容反序列化时,只需要输入文件的路径,然后调用对应组件的ReadData方法即可。在Demo中文件的路径被集中存放在了AssetUtility静态类下,其提供了如GetConfigAsset,GetDataTableAsset的接口,只需要输入资源名称和是否从二进制文件读取即可,函数内部将自动拼接相对于Assets的完整的包含文件后缀名的路径并返回。
添加到标志数组:
该流程在Update中遍历标志数组,如果全部加载完毕,则转到下一个流程,因此每个加载操作都要添加到标志数组。该流程订阅了加载事件,每当加载结束后,就会将标志数组中对应的条目赋值为true。
进行实际加载:
通过GameEntry.Config.ReadData,传入文件路径,即可将配置文件读入组件中。这个全局配置里面存的就是场景ID
数据表加载:
数据表通常有多份,在Demo中,因为数量不多,直接将所有数据表名称做成一个数组放在了Preload流程中作为成员变量存在,在加载时遍历名称数组,依次加载。
获取路径:
同上
添加到标志数组:
同上
进行实际加载:
StarForce自己做了一个扩展方法LoadDataTable在DataTableExtension类中。看了一下,主要进行了以下操作:
- 确保传入参数有效
- 用“_”分割表名,取第一个部分,作为类型名用反射的方式获取DataRow的类型
- 调用DataTableComponent的CreateDataTable方法,传入DataRow类型,接收返回值DataTableBase
- 调用返回的DataTableBase的ReadData方法,将表的内容反序列化到表中
其实就是要根据指定的行类型来新建一个表对象,再往表里塞东西。这一点使用UE新建表时也是一样的。
语言加载:
为了支持本地化,GameFramework有专门的Localization组件,显示文字的时候要通过其获取文字。而对其的配置则是通过XML来配置。因此这个阶段也可以一并将语言文本也一起加载进来。
语言加载和第一个不同的就是是调用的GameEntry.Localization组件来ReadData,其他同上
字体加载:
语言加载完成后就是对应的字体加载。字体加载固定加载MainFont,并且是直接使用ResourceComponent来加载,使用callback来完成加载完的处理,该Demo还额外做了个UI的基类UIForm,内部有一个静态函数SetMainFont和静态字段Font s_MainFont,凡继承了该UI基类,在初始化时,所有Text组件的Font都会被替换成该s_MainFont。