【Unity/GameFramework】Start Force ——配置和表加载

ops/2024/11/14 13:06:37/

文章目录

    • 前言
    • 寻找流程
    • 具体加载
      • 配置加载:
        • 获取路径:
        • 添加到标志数组:
        • 进行实际加载:
      • 数据表加载:
        • 获取路径:
        • 添加到标志数组:
        • 进行实际加载:
      • 语言加载:
      • 字体加载:

前言

首先思考如果不使用框架,那么我们大概率会专门包装做一个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.ppmy.cn/ops/133270.html

相关文章

Linux中的挂载

假设我们有一个 U 盘设备,当我们将 U 盘挂载到 /mnt/usb 目录时,系统会把这个 U 盘文件系统中的内容与 /mnt/usb 关联起来,之后我们只需进入 /mnt/usb,就能看到 U 盘中的所有文件。 挂载前:/mnt/usb 目录是空的。挂载…

重生之从零设计 MySQL 架构

我叫萧剑臣,今年 34 岁,2024 年快接近尾声,在一线城市「浅圳」打拼,在一家名叫「网讯」的互联网大厂工作,是一名资深后端架构师。 已经连续加班到 23:00 半年多才下班,现在已是亥时,push 完代码…

关于倍速播放百度网盘视频

免责声明: 下述内容均为自学探索,仅供学习交流!!! 【侵权删】 正文: 倍速播放百度网盘视频,检索到的通常有:1、使用夸克浏览器倍速播放;2、使用ipad 快捷命令。 推荐…

mac环境配置本地nfs服务

前言 在这篇文章中,讲了在Mac端开启NFS服务,并通过NFS协议让其他设备挂载到你的Mac上。 步骤一:增加配置文件 首先,我们需要编辑NFS的配置文件,以便定义哪些目录可以被远程访问。 打开终端,输入以下命令以编…

OpenEuler 下 Docker 安装、配置与测试实例

文章目录 前言1. 环境准备2. 下载 Docker3.配置服务文件4.配置加速器加速下载docker镜像5. 验证 Docker 安装 前言 Docker 安装大致分为包管理器安装、脚本安装、离线手动安装、容器编排工具安装、桌面版安装等,每种安装各有特点,但涉及知识面不少&…

VR的左右眼渲染方法

VR的左右眼视频渲染shader unity_StereoEyeIndex 结点可以判断当前渲染的时候左眼还是右眼,所以可以通过着色器来更根据当前眼睛使用不同的渲染方式达到左右眼渲染不同。 Shader "Unlit/VRVideoPlay" {Properties{_MainTex ("Texture", 2D) …

【C#设计模式(6)——适配器模式(Adapter Pattern)】

前言 C#设计模式(6)——适配器模式(Adapter Pattern) 适配器模式主要用于在不修改现有类的情况下,使本来不包含的类可以一起工作。 代码 //插头接口 public interface IPlug {void Charge(); } //插头适配 public class Adapter {public void ConverterCharge(){Co…

CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳

2024年11月9日至10日,以“湾区聚力 开源启智”为主题的2024年中国计算机学会中国开源大会(CCF ChinaOSC)将在深圳召开。大会将汇聚国内外学术界、顶尖科技企业、科研机构及开源社区的精英力量,共同探索人工智能技术和人类智慧的无…