当前位置: 首页 > article >正文

【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。


http://www.kler.cn/a/390956.html

相关文章:

  • 万字长文解读深度学习——ViT、ViLT、DiT
  • ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结
  • 2024.11.12_大数据的诞生以及解决的问题
  • IEC60870-5-104 协议源码架构详细分析
  • 【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
  • Vim9 语法高亮syntax 在指定的缓冲区和窗口执行命令
  • 二分答案-整型二分—愤怒的牛-P1676 [USACO05FEB] Aggressive cows G
  • 微服务架构面试内容整理-监控与追踪-Zipkin
  • AlphaFold3中文安装教程
  • Unity类银河战士恶魔城学习总结(P117 Ice And Fire Item Effec 制作一把冰火属性的剑)
  • 练习题 - Django 4.x WWW 网址使用示例和配置方法
  • Git推送报错Authentication failed
  • 深入探讨钉钉与金蝶云星空的数据集成技术
  • 在linux上搭建一个nodejs服务_全流程
  • 如何将交叉编译配置在环境变量中
  • arcgis for js实现popupTemplate弹窗field名称和值转义
  • 【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)
  • 【开源免费】基于SpringBoot+Vue.JS宠物咖啡馆平台(JAVA毕业设计)
  • uniapp的基本使用(easycom规范和条件编译)和uview组件的安装和使用
  • 天地图入门|标注|移动飞行|缩放,商用地图替换
  • 自动化新时代:机器取代工作,我们该如何重塑自我?
  • 企业级工位管理:Spring Boot解决方案
  • 自媒体素材10个4K分辨率Premiere胶片漏光划痕特效视频转场过渡模板
  • 【Python3】【力扣题】414. 第三大的数
  • 代码随想录算法训练营第二十天|39. 组合总和、40.组合总和II、131.分割回文串
  • [MySQL]隐式类型转换