ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

【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持久化数据用法比较类似,但实现方式是不一样的。

这个Config自己维护了一个字典用来存放ConfigData的数据,每个全局配置的参数都有一个对应的ConfigData数据。

ConfigData是一个结构体,有四个字段,支持存储4中不同类型的数据。

(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、代码分析

源码可以进入Gitee版本库里面进行查看:https://gitee.com/jiangyin/GameFramework

ConfigManager.cs脚本:

https://gitee.com/jiangyin/GameFramework/blob/master/GameFramework/Config/ConfigManager.cs

namespace GameFramework.Config
{internal sealed partial class ConfigManager : GameFrameworkModule, IConfigManager{private readonly Dictionary<string, ConfigData> m_ConfigDatas;private readonly DataProvider<IConfigManager> m_DataProvider;private IConfigHelper m_ConfigHelper;/// <summary>/// 初始化全局配置管理器的新实例。/// </summary>public ConfigManager();/// <summary>/// 获取全局配置项数量。/// </summary>public int Count;/// <summary>/// 读取全局配置。/// </summary>/// <param name="configAssetName">全局配置资源名称。</param>public void ReadData(string configAssetName);/// <summary>/// 解析全局配置。/// </summary>/// <param name="configString">要解析的全局配置字符串。</param>/// <returns>是否解析全局配置成功。</returns>public bool ParseData(string configString);/// <summary>/// 从指定全局配置项中读取布尔值。/// </summary>/// <param name="configName">要获取全局配置项的名称。</param>/// <returns>读取的布尔值。</returns>public bool GetBool(string configName);/// <summary>/// 从指定全局配置项中读取整数值。/// </summary>/// <param name="configName">要获取全局配置项的名称。</param>/// <returns>读取的整数值。</returns>public int GetInt(string configName);/// <summary>/// 从指定全局配置项中读取浮点数值。/// </summary>/// <param name="configName">要获取全局配置项的名称。</param>/// <returns>读取的浮点数值。</returns>public float GetFloat(string configName);/// <summary>/// 从指定全局配置项中读取字符串值。/// </summary>/// <param name="configName">要获取全局配置项的名称。</param>/// <returns>读取的字符串值。</returns>public string GetString(string configName);}
}

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和坑,让后来人可以有些参考。
返回列表