【GameFramework框架内置模块】1、全局配置(Config)

news2024/10/6 20:37:34

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551

这是GameFramework框架内置模块的第一篇,全局配置Config,讲解这些模块的时候会尽量的涉及介绍、为什么使用、如何使用、代码分析这几块,让大家可以知其然,也知其所以然。

二、正文

2-1、介绍

全局配置表,存储了一些游戏中使用的全局的参数配置,比如玩家的初始速度、游戏初始音量等。

全局配置表的结构跟DataTable结构类似,也是列行+键值对,只是没有ID这一列,因为全局配置也不需要用ID去查询, 是直接使用key值进行查询。

2-2、全局配置的作用

全局配置的作用,其实我在介绍里面已经说了,就是存储游戏中使用的全局的参数配置,比如玩家的初始速度、初始蓝量、初始防御力等等。

在实际开发中,也会有这么一个类来存放初始数据,不过通常都需要程序员自己去写这个类存放初始数值,而GF框架已经帮我们封装好了,我们只需要拿来用就可以了。

2-3、全局配置表使用说明

配置文件推荐存放位置

这里我们以官方的StarForce演示项目为例,配置文件都在这里:
在这里插入图片描述
说明一下,框架里面是没有GameMain这个文件夹的,这个文件夹是自己的源工程文件的位置,可以放场景、脚本、配置文件等东西。

也就是说,Configs里面放的东西也是自己配置的,下面就说明一下这个文件怎么配置,以及怎么使用的。

配置文件的格式

我们打开一个名字叫做DefaultConfig的默认配置文件:
在这里插入图片描述
文件的格式是txt的,内容是个表(比如将json存到一个txt里面,只是为了读取方便,文件格式不重要,重要的里面的内容是怎么读取的)。

先来看一下表结构:
配置项 | 策划备注 | 配置值

OK,了解了表结构,我们来看一下如何快速使用全局配置Config。

(1)首先,我们需要构建一个表,这里用了示例的DefaultConfig.txt的文件:
在这里插入图片描述
路径需要记住,需要动态加载。

(2)新建脚本Test01.cs,双击编辑代码:

using StarForce;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test01 : MonoBehaviour
{
    private void Awake()
    {
        LoadConfig();
    }

    private void LoadConfig()
    {
        // 全局配置表路径
        string configAssetName = "Assets/GameMain/Configs/DefaultConfig.txt";
        // 读取
        GameEntry.Config.ReadData(configAssetName, this);
    }

    void Start()
    {
        // 获取GameID
        int GameID = GameEntry.Config.GetInt("Scene.Main");
        Debug.Log(GameID);
    }
}

就Unity持久化数据用法比较类似,实际也就是一回事,只是这个持久化做了封装和统一管理,避免太分散不好管理。

(3)建立流程,运行脚本

这个脚本直接挂载物体上是肯定是不能直接运行的,不符合框架流程

PS:这里再啰嗦一下,这个框架内部有一个自己的运行流程,代码执行顺序,我们使用这个框架的时候,就要避免再使用Unity原来的流程比如Start、Update、Awake,特别是制作流程的时候。
当然,避免使用不是不用,其他不是流程的脚本也可以用Unity的流程

接下来,我们需要制作一个流程,让框架首先去运行这个流程入口,然后流程入口再执行我们的代码。

我们再次打开我们的Test01.cs脚本,修改代码:

using StarForce;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;

public class Test01 : ProcedureBase
{
    public override bool UseNativeDialog => throw new System.NotImplementedException();

    protected override void OnEnter(ProcedureOwner procedureOwner)
    {
        base.OnEnter(procedureOwner);

        LoadConfig();
    }

    protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
    {
        base.OnLeave(procedureOwner, isShutdown);
    }

    protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
    {
        base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

        // 获取GameID
        int GameID = GameEntry.Config.GetInt("Scene.Main");
        Debug.Log(GameID);
    }

    private void LoadConfig()
    {
        // 全局配置表路径
        string configAssetName = "Assets/GameMain/Configs/DefaultConfig.txt";
        // 读取
        GameEntry.Config.ReadData(configAssetName, this);
    }
}

PS:继承ProcedureBase

使用OnEnter、OnLeave、OnUpdate做状态切换,这里用到了FSM状态机,在另一篇文章有涉及,感兴趣的读者可以翻过去看看:【GameFramework框架】三、快速启动

(4)设置流程启动
将框架中的GameFramework预制体,拖入场景中,挂载GameEntry脚本:
在这里插入图片描述
在这里插入图片描述
找到流程组件,设置启动流程:
在这里插入图片描述
运行程序:
在这里插入图片描述
顺利打印。

2-4、代码分析

全局配置组件:
在这里插入图片描述
**IConfigManager **

namespace GameFramework.Config;

public interface IConfigManager : IDataProvider<IConfigManager>
{
    //     获取全局配置项数量。
    int Count { get; }
    //     获取缓冲二进制流的大小。
    int CachedBytesSize { get; }
    //     资源管理器。
    void SetResourceManager(IResourceManager resourceManager);
    //     全局配置数据提供者辅助器。
    void SetDataProviderHelper(IDataProviderHelper<IConfigManager> dataProviderHelper);
    //     全局配置辅助器。
    void SetConfigHelper(IConfigHelper configHelper);
    //     要确保二进制流缓存分配内存的大小。
    void EnsureCachedBytesSize(int ensureSize);
    //     释放缓存的二进制流。
    void FreeCachedBytes();
    //     指定的全局配置项是否存在。
    bool HasConfig(string configName);
    //     从指定全局配置项中读取布尔值。
    bool GetBool(string configName);
    //     从指定全局配置项中读取布尔值。
    bool GetBool(string configName, bool defaultValue);
    //     从指定全局配置项中读取整数值。
    int GetInt(string configName);
    //     从指定全局配置项中读取整数值。
    int GetInt(string configName, int defaultValue);
    //     从指定全局配置项中读取浮点数值。
    float GetFloat(string configName);
    //     从指定全局配置项中读取浮点数值。
    float GetFloat(string configName, float defaultValue);
    //     从指定全局配置项中读取字符串值。
    string GetString(string configName);
    //     从指定全局配置项中读取字符串值。
    string GetString(string configName, string defaultValue);
    //     增加指定全局配置项。
    bool AddConfig(string configName, string configValue);
    //     增加指定全局配置项。
    bool AddConfig(string configName, bool boolValue, int intValue, float floatValue, string stringValue);
    //     移除指定全局配置项。
    bool RemoveConfig(string configName);
    //     清空所有全局配置项。
    void RemoveAllConfigs();
}

ConfigData
配置文件解析后存到一个ConfigData类,ConfigData是一个结构体,有四个字段,支持存储4中不同类型的数据:

namespace GameFramework.Config
{
    internal sealed partial class ConfigManager : GameFrameworkModule, IConfigManager
    {
        private struct ConfigData
        {
            private readonly bool m_BoolValue;
            private readonly int m_IntValue;
            private readonly float m_FloatValue;
            private readonly string m_StringValue;
		}
	}
}

所以,当配置表中的数据被读取出来之后,会被同时解析成四种类型,然后构造一个ConfigData进行存储:

/// 增加指定全局配置项。
public bool AddConfig(string configName, string configValue)
{
    bool boolValue = false;
    bool.TryParse(configValue, out boolValue);

    int intValue = 0;
    int.TryParse(configValue, out intValue);

    float floatValue = 0f;
    float.TryParse(configValue, out floatValue);
    
	//把解析的四种类型值全部存入ConfigData
    return AddConfig(configName, boolValue, intValue, floatValue, configValue);
}
/// 增加指定全局配置项。
public bool AddConfig(string configName, bool boolValue, int intValue, float floatValue, string stringValue)
{
    m_ConfigDatas.Add(configName, new ConfigData(boolValue, intValue, floatValue, stringValue));
    return true;
}

之后就是正常的使用了:

//通过Key值:Scene.Main 查询配置
var lastSceneId = GameEntry.Config.GetInt("Scene.Main"));

ConfigComponent提供了四种方式GetInt、GetBool、GetFloat、GetString,获取四种类型的值,但是获取的值需要跟设置的值要相同,不然就获取不到正确的值了。

比如存储Scene.Main值是2,用GetBool获取可能就是默认值false,但是通过GetInt就能获取正确的2。

这么设计的原因可能是为了配置一个字段,但是有可能用到他的不同类型。

比如枚举判断,我们可以用int值,数据乘除计算的时候,可能使用float值。

这样设计用起来就非常灵活了。

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1446268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AtCoder Beginner Contest 340(A-G)

A - Arithmetic Progression (atcoder.jp) 1.思路&#xff1a;循环输出即可 2.代码&#xff1a; #include <bits/stdc.h> #define rep(i,z,n) for(int i z;i < n; i) #define per(i,n,z) for(int i n;i > z; i--) #define PII pair<int,int> #define fi f…

【51单片机】串口(江科大)

8.1串口通信 1.串口介绍 2.硬件电路 3.电平标准 电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种: 电平标准是数据1和数据O的表达方式,是传输线缆中人为规定的电 压与数据的对应关系,串口常用的电平标准有如下…

Microsoft Excel 加载数据分析工具

Microsoft Excel 加载数据分析工具 1. 打开 Excel&#xff0c;文件 -> 选项2. 加载项 -> 转到…3. 分析工具库、分析工具库 - VBA4. 打开 Excel&#xff0c;数据 -> 数据分析References 1. 打开 Excel&#xff0c;文件 -> 选项 2. 加载项 -> 转到… ​​​ 3…

2013-2022年上市公司迪博内部控制指数、内部控制分项指数数据

2013-2022年上市公司迪博内部控制指数、分项指数数据 1、时间&#xff1a;2013-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、战略层级指数、经营层级指数、报告可靠指数、合法合规指数、资产安全…

蓝桥杯-X图形

问题描述 给定一个字母矩阵。一个 X 图形由中心点和由中心点向四个 45度斜线方向引出的直线段组成&#xff0c;四条线段的长度相同&#xff0c;而且四条线段上的字母和中心点的字母相同。 一个 X 图形可以使用三个整数 r,c,L 来描述&#xff0c;其中 r,c 表示中心点位于第 r 行…

Matplotlib核心:掌握Figure与Axes

详细介绍Figure和Axes&#xff08;基于Matplotlib&#xff09; &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333; 一、Figure&#xff08;图形&#xff09;&#x1f333;&#x1f341;1. 创建Figure&#x1f341;&#x1f341;2. 添加Axes&am…

代码随想录刷题笔记 DAY 24 | 回溯算法理论基础 | 组合问题 No. 77

文章目录 Day 2401. 回溯算法理论基础1.1 什么是回溯法&#xff1f;1.2 为什么要使用回溯法&#xff1f;1.3 如何理解回溯法&#xff1f; 02. 组合问题&#xff08;No. 77&#xff09;2.1 题目2.2 笔记2.3 代码 Day 24 01. 回溯算法理论基础 1.1 什么是回溯法&#xff1f; &…

Kafka 入门笔记

课程地址 概述 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff09; 发布/订阅&#xff1a;消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只接受感兴趣的消息 消息队列 消息队…

算法沉淀——位运算(leetcode真题剖析)

算法沉淀——位运算 常用位运算总结1.基础位运算2.确定一个数中第x位是0还是13.将一个数的第x位改成14.将一个数的第x位改成05.位图6.提取一个数最右边的17.删掉一个数最右边的18.异或运算9.基础例题 力扣题目讲解01.面试题 01.01. 判定字符是否唯一02.丢失的数字03.两整数之和…

Linux:搭建docker私有仓库(registry)

当我们内部需要存储镜像时候&#xff0c;官方提供了registry搭建好直接用&#xff0c;废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…

lv15 驱动高级设备模型 1

之前的驱动操作称为硬编 一、起源 仅devfs&#xff08;dev目录&#xff09;&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔&#xff08;如何插入一个设备然后找到设备的驱动应用到程序中&#xff09; 不支持一些针对所有设备的统一操作&#xff08;如电…

【51单片机】AT24C02(江科大、爱上半导体)

一、AT24C02 1.AT24C02介绍 AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息 存储介质:E2PROM 通讯接口:12C总线 容量:256字节 2.引脚即应用电路 本开发板AT24C02原理图 12C地址全接地,即全为0 WE接地,没有写使能 SCL接P21 S…

无人机飞行原理,多旋翼无人机飞行原理详解

多旋翼无人机升空飞行的首要条件是动力&#xff0c;有了动力才能驱动旋粪旋转&#xff0c;才能产生克服重力所必需的升力。使旋翼产生升力&#xff0c;进而推动多旋翼无人机升空飞行的一套设备装置称为动力装置&#xff0c;包括多旋翼无人机的发动机以及保证发动机正常工作所必…

Could not determine ref type of version: remote: Invalid credentials

在按照别人代码的README配置环境时&#xff0c;需要clone很多库&#xff0c;但是有一个库一直下不下来。 解决办法&#xff0c;直接上github搜索该库&#xff0c;选好相应的版本tag&#xff0c; git clone -b <branch_name> <link>下载即可。

计算机网络——04接入网和物理媒体

接入网和物理媒体 接入网络和物理媒体 怎样将端系统和边缘路由器连接&#xff1f; 住宅接入网络单位接入网络&#xff08;学校、公司&#xff09;无线接入网络 住宅接入&#xff1a;modem 将上网数据调制加载到音频信号上&#xff0c;在电话线上传输&#xff0c;在局端将其…

InternLM大模型实战-5.LMDeploy大模型量化部署实战

文章目录 前言笔记正文大模型部署背景部署挑战部署方案 LMDeploy框架量化推理引擎Turbomind推理服务api server 前言 本文是对于InternLM全链路开源体系系列课程的学习笔记 【LMDeploy 大模型量化部署实践】 https://www.bilibili.com/video/BV1iW4y1A77P/?share_sourcecopy_…

《Linux 简易速速上手小册》第4章: 包管理与软件安装(2024 最新版)

文章目录 4.1 包管理基础4.1.1 重点基础知识4.1.2 重点案例&#xff1a;在 Ubuntu 上安装和管理软件4.1.3 拓展案例 1&#xff1a;添加软件仓库4.1.4 拓展案例 2&#xff1a;回滚软件到旧版本 4.2 使用 APT 与 YUM4.2.1 重点基础知识4.2.2 重点案例&#xff1a;在 Ubuntu 上配置…

Python||数据分析之pyecharts 绘图(词云、气泡)

1. echarts 和 Pyecharts 简介 1.1echarts 简介: • echarts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 • echarts 遵循 Apache-2.0 开源协议,免费商用。 • ECharts 最初由百度团队开源,并于 2018 年初捐赠给 Apache 基金会,成为 AS…

第9讲用户信息修改实现

用户信息修改实现 后端修改用户昵称&#xff1a; /*** 更新用户昵称* param wxUserInfo* param token* return*/ RequestMapping("/updateNickName") public R updateNickName(RequestBody WxUserInfo wxUserInfo,RequestHeader String token){if(StringUtil.isNot…