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

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

推荐阅读

  • 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(){// 获取GameIDint 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);// 获取GameIDint 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);//把解析的四种类型值全部存入ConfigDatareturn 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和坑,让后来人可以有些参考。

相关文章:

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

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…...

PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程、Spark新特性

目录 PySpark SQL 基础 SparkSession对象 DataFrame入门 DataFrame构建 DataFrame代码风格 DSL SQL SparkSQL Shuffle 分区数目 DataFrame数据写出 Spark UDF Catalyst优化器 Spark SQL的执行流程 Spark新特性 自适应查询(SparkSQL) 动态合并 动态调整Join策略 …...

2024第六届中国济南国际福祉及残疾人用品展览会/失能护理展

龘龘龙年-第六届山东福祉展会-将于5月27-29日在济南黄河国际会展中心举办&#xff1b; 一、引言 2024年&#xff0c;中国龙年&#xff0c;龙象征着力量、繁荣与希望。在这个特殊的年份&#xff0c;一场备受瞩目的盛会即将拉开帷幕。2024年第六届中国&#xff08;济南&#xf…...

SegmentAnything官网demo使用vue+python实现

一、效果&准备工作 1.效果 没啥好说的&#xff0c;低质量复刻SAM官网 https://segment-anything.com/ 需要提一点&#xff1a;所有生成embedding和mask的操作都是python后端做的&#xff0c;计算mask不是onnxruntime-web实现的&#xff0c;前端只负责了把rle编码的mask解…...

Java:字符集、IO流 --黑马笔记

一、字符集 1.1 字符集的来历 我们知道计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一个字符进行了编码&#xff08;所谓编码&#xff0c;就是为一个…...

RabbitMQ之五种消息模型

1、 环境准备 创建Virtual Hosts 虚拟主机&#xff1a;类似于mysql中的database。他们都是以“/”开头 设置权限 2. 五种消息模型 RabbitMQ提供了6种消息模型&#xff0c;但是第6种其实是RPC&#xff0c;并不是MQ&#xff0c;因此不予学习。那么也就剩下5种。 但是其实3、4…...

项目02《游戏-14-开发》Unity3D

基于 项目02《游戏-13-开发》Unity3D &#xff0c; 任务&#xff1a;战斗系统之击败怪物与怪物UI血条信息 using UnityEngine; public abstract class Living : MonoBehaviour{ protected float hp; protected float attack; protected float define; …...

【Java数据结构】单向 不带头 非循环 链表实现

模拟实现LinkedList&#xff1a;下一篇文章 LinkedList底层是双向、不带头结点、非循环的链表 /*** LinkedList的模拟实现*单向 不带头 非循环链表实现*/ class SingleLinkedList {class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val …...

【ES6】模块化

nodejs遵循了CommonJs的模块化规范 导入 require() 导出 module.exports 模块化的好处&#xff1a; 模块化可以避免命名冲突的问题大家都遵循同样的模块化写代码&#xff0c;降低了沟通的成本&#xff0c;极大方便了各个模块之间的相互调用需要啥模块&#xff0c;调用就行 …...

腾讯云4核8G服务器可以用来干嘛?怎么收费?

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…...

怎么在bash shell中操作复杂json对象

怎么在bash shell中操作复杂json对象 在bash shell中操作复杂JSON对象&#xff0c;jq可以帮助我们在bash环境下轻松地处理这类数据&#xff0c;本文将详细介绍如何使用jq在bash中操作复杂的JSON对象。 jq是一个轻量级且灵活的命令行JSON处理器&#xff0c;它允许你以非常高效的…...

11.div函数

文章目录 函数简介1.函数原型2.div_t结构体3.引用头文件 代码运行 函数简介 1.函数原型 div_t div(int numerator, int denominator);div函数把numerator除以denominator&#xff0c;产生商和余数&#xff0c;用一个div_t的结构体返回。 2.div_t结构体 typedef struct _div…...

windows11 MSYS2下载安装教程

MSYS2 可以理解为在windows平台上模拟linux编程环境的开源工具集 当前环境&#xff1a;windows11 1. 下载 官网地址可下载最新版本&#xff0c;需要科学上网 https://www.msys2.org/ 2. 安装 按照正常安装软件流程一路next就可以 打开 3. 配置环境 网上很多教程提到需…...

Excel+VBA处理高斯光束

文章目录 1 图片导入与裁剪2 获取图片数据3 数据拟合 1 图片导入与裁剪 插入图片没什么好说的&#xff0c;新建Excel&#xff0c;【插入】->【图片】。 由于图像比较大&#xff0c;所以要对数据进行截取&#xff0c;选中图片之后&#xff0c;点击选项卡右端的【图片格式】…...

如何启动若依框架

Mysql安装 一、下载 链接&#xff1a;https://pan.baidu.com/s/1s8-Y1ooaRtwP9KnmP3rxlQ?pwd1234 提取码&#xff1a;1234 二、安装(解压) 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 5.7.24的软件本体了(就是一个文件夹)&…...

案例:CentOS8 在 MySQL8.0 实现半同步复制

异步复制 MySQL 默认的复制即是异步的&#xff0c;主库在执行完客户端提交的事务后会立即将结果返给给客户端&#xff0c;并不关心从库是否已经接收并处理&#xff0c;这样就会有一个问题&#xff0c;主节点如果 crash 掉了&#xff0c;此时主节点上已经提交的事务可能并没有传…...

阿里云带宽计费模式怎么选?如何收费的?

阿里云服务器带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;按使用…...

c#记录几个问题

最近在看c#&#xff0c;有几个问题记录下 1&#xff09;全局变量&#xff0c;其实是声明一个public static类&#xff0c;里面包含一些public static变量和函数&#xff0c;也就是在程序开始运行后就创生了一个对应的存储空间&#xff0c;调用时就要写明是谁的什么变量。针对的…...

第69讲后端登录逻辑实现

Admin实体&#xff1a; TableName("t_admin") Data public class Admin {TableId(type IdType.AUTO)private Integer id; // 编号private String userName; // 用户名private String password; // 密码TableField(select false)private String newPassword; // 新…...

Qt 字符串类应用与常用基本数据类型

目录 操作字符串 查询字符串 Qt 常见数据类型 操作字符串 创建一个控制台项目 &#xff08;1&#xff09;QString提供一个二元的 “” 操作符&#xff0c;主要用于组合两个字符串。QString str1 "Hello World 传递给QString一个 const char* 类型的ASCII字符串 “He…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...