推荐阅读
- CSDN主页
- GitHub开源地址
- Unity3D插件分享
- 简书地址
- QQ群:398291828
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551
配置模块:
二、正文
2-1、介绍
配置(Setting)模块
,我觉得可以跟全局配置(Config)模块
对比着来讲。
都是配置,它们有什么区别呢,为啥要分开呢。
相信初学的这个小伙伴都要这些疑问,那我们就来对比着来看一下吧:
模块 | 功能 | 读取方式 | 设置机制 |
---|---|---|---|
全局配置(Config) | 存储游戏中使用的全局的参数配置 ,比如玩家的初始速度、初始蓝量、初始防御力 等等。 | 使用配置文件读取 | 策划设计修改参数 |
配置(Setting) | 管理游戏中的一些配置设置,比如游戏声音的音量、音乐的音量、UI声音的音量 等等。 | 类似PlayerPrefs读取 | 玩家自己配置 |
是不是有点清晰了。。。
全局配置(Config)
:开始前配置,是全局配置文件,配置游戏的初始参数。
配置(Setting)
:运行中配置,是存档功能,类似PlayerPrefs
。
2-2、使用说明
判断key是否存在、读取、保存:
//判断key是否存在
if (GameEntry.Setting.HasSetting(Constant.Setting.Language))
{//读取settingstring languageString = GameEntry.Setting.GetString(Constant.Setting.Language);language = (Language)Enum.Parse(typeof(Language), languageString);
}
else
{//存储settingGameEntry.Setting.SetString(Constant.Setting.Language, language.ToString());GameEntry.Setting.Save();
}
2-3、实现及代码分析
(1)SettingComponent.cs
提供基本数据类型配置的,增删改查
的功能。
using GameFramework;
using GameFramework.Setting;
using System;
using System.Collections.Generic;
using UnityEngine;namespace UnityGameFramework.Runtime
{/// <summary>/// 游戏配置组件。/// </summary>[DisallowMultipleComponent][AddComponentMenu("Game Framework/Setting")]public sealed class SettingComponent : GameFrameworkComponent{private string m_SettingHelperTypeName = "UnityGameFramework.Runtime.DefaultSettingHelper";/// <summary>/// 保存游戏配置。/// </summary>public void Save(){}/// <summary>/// 获取所有游戏配置项的名称。/// </summary>/// <returns>所有游戏配置项的名称。</returns>public string[] GetAllSettingNames(){}/// <summary>/// 获取所有游戏配置项的名称。/// </summary>/// <param name="results">所有游戏配置项的名称。</param>public void GetAllSettingNames(List<string> results){}/// <summary>/// 检查是否存在指定游戏配置项。/// </summary>/// <param name="settingName">要检查游戏配置项的名称。</param>/// <returns>指定的游戏配置项是否存在。</returns>public bool HasSetting(string settingName){}/// <summary>/// 移除指定游戏配置项。/// </summary>/// <param name="settingName">要移除游戏配置项的名称。</param>public void RemoveSetting(string settingName){}/// <summary>/// 清空所有游戏配置项。/// </summary>public void RemoveAllSettings(){}/// <summary>/// 从指定游戏配置项中读取布尔值。/// </summary>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <returns>读取的布尔值。</returns>public bool GetBool(string settingName){}/// <summary>/// 从指定游戏配置项中读取整数值。/// </summary>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <returns>读取的整数值。</returns>public int GetInt(string settingName){}/// <summary>/// 从指定游戏配置项中读取浮点数值。/// </summary>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <returns>读取的浮点数值。</returns>public float GetFloat(string settingName){}/// <summary>/// 从指定游戏配置项中读取字符串值。/// </summary>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <returns>读取的字符串值。</returns>public string GetString(string settingName){}/// <summary>/// 向指定游戏配置项写入字符串值。/// </summary>/// <param name="settingName">要写入游戏配置项的名称。</param>/// <param name="value">要写入的字符串值。</param>public void SetString(string settingName, string value){}/// <summary>/// 从指定游戏配置项中读取对象。/// </summary>/// <typeparam name="T">要读取对象的类型。</typeparam>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <returns>读取的对象。</returns>public T GetObject<T>(string settingName){}/// <summary>/// 从指定游戏配置项中读取对象。/// </summary>/// <param name="objectType">要读取对象的类型。</param>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <returns>读取的对象。</returns>public object GetObject(Type objectType, string settingName){}/// <summary>/// 从指定游戏配置项中读取对象。/// </summary>/// <typeparam name="T">要读取对象的类型。</typeparam>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <param name="defaultObj">当指定的游戏配置项不存在时,返回此默认对象。</param>/// <returns>读取的对象。</returns>public T GetObject<T>(string settingName, T defaultObj){}/// <summary>/// 从指定游戏配置项中读取对象。/// </summary>/// <param name="objectType">要读取对象的类型。</param>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <param name="defaultObj">当指定的游戏配置项不存在时,返回此默认对象。</param>/// <returns>读取的对象。</returns>public object GetObject(Type objectType, string settingName, object defaultObj){}/// <summary>/// 向指定游戏配置项写入对象。/// </summary>/// <typeparam name="T">要写入对象的类型。</typeparam>/// <param name="settingName">要写入游戏配置项的名称。</param>/// <param name="obj">要写入的对象。</param>public void SetObject<T>(string settingName, T obj){}/// <summary>/// 向指定游戏配置项写入对象。/// </summary>/// <param name="settingName">要写入游戏配置项的名称。</param>/// <param name="obj">要写入的对象。</param>public void SetObject(string settingName, object obj){}}
}
数据存储通过Save接口来实现,每次Save会调用数据的序列化然后写入到本地,写入可能会占用一定的I0带宽,所以不要做太过频繁的存储操作,比如Update中。
框架默认会在游戏停止运行前的OnDestroy时,调用所有管理组件Shutdown函数,而SettingManager会在Shutdown时调用Save函数进行数据存储。
不过为了防止程序发生意外退出,我们还是在修改了配置后,用户手动点击保存时,把Setting写入到本地,防止数据丢失。
(2)SettingManager.cs
提供配置模块基本的API接口。
using System;
using System.Collections.Generic;namespace GameFramework.Setting
{/// <summary>/// 游戏配置管理器。/// </summary>internal sealed class SettingManager : GameFrameworkModule, ISettingManager{private ISettingHelper m_SettingHelper;/// <summary>/// 游戏配置管理器轮询。/// </summary>/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>internal override void Update(float elapseSeconds, float realElapseSeconds){}/// <summary>/// 关闭并清理游戏配置管理器。/// </summary>internal override void Shutdown(){}/// <summary>/// 设置游戏配置辅助器。/// </summary>/// <param name="settingHelper">游戏配置辅助器。</param>public void SetSettingHelper(ISettingHelper settingHelper){}/// <summary>/// 加载游戏配置。/// </summary>/// <returns>是否加载游戏配置成功。</returns>public bool Load(){}/// <summary>/// 保存游戏配置。/// </summary>/// <returns>是否保存游戏配置成功。</returns>public bool Save(){}/// <summary>/// 获取所有游戏配置项的名称。/// </summary>/// <returns>所有游戏配置项的名称。</returns>public string[] GetAllSettingNames(){}/// <summary>/// 检查是否存在指定游戏配置项。/// </summary>/// <param name="settingName">要检查游戏配置项的名称。</param>/// <returns>指定的游戏配置项是否存在。</returns>public bool HasSetting(string settingName){}/// <summary>/// 移除指定游戏配置项。/// </summary>/// <param name="settingName">要移除游戏配置项的名称。</param>/// <returns>是否移除指定游戏配置项成功。</returns>public bool RemoveSetting(string settingName){}/// <summary>/// 从指定游戏配置项中读取布尔值。/// </summary>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <param name="defaultValue">当指定的游戏配置项不存在时,返回此默认值。</param>/// <returns>读取的布尔值。</returns>public bool GetBool(string settingName, bool defaultValue){}/// <summary>/// 从指定游戏配置项中读取整数值。/// </summary>/// <param name="settingName">要获取游戏配置项的名称。</param>/// <returns>读取的整数值。</returns>public int GetInt(string settingName){}}
}
SettingManager
提供基本的API接口,DefaultSettingHelper
和PlayerPrefsSettingHelper
就是这些接口的实现类。
这些实现类,通过继承SettingHelperBase
,就可以使用不同的存储方式实现Setting
配置数据存储。
DefaultSettingHelper
使用二进制存储方法存储数据。
PlayerPrefsSettingHelper
使用系统自带的PlayerPrefs
存储方式。
(3)SettingHelperBase.cs
using GameFramework.Setting;
using System;
using System.Collections.Generic;
using UnityEngine;namespace UnityGameFramework.Runtime
{/// <summary>/// 游戏配置辅助器基类。/// </summary>public abstract class SettingHelperBase : MonoBehaviour, ISettingHelper{}
}
(4)DefaultSettingHelper.cs
通过二进制的方式存储Setting
数据的工具。
存储文件:GameFrameworkSetting.dat
/// 序列化数据。
public void Serialize(Stream stream)
{using (BinaryWriter binaryWriter = new BinaryWriter(stream, Encoding.UTF8)){binaryWriter.Write7BitEncodedInt32(m_Settings.Count);foreach (KeyValuePair<string, string> setting in m_Settings){binaryWriter.Write(setting.Key);binaryWriter.Write(setting.Value);}}
}/// 反序列化数据。
public void Deserialize(Stream stream)
{m_Settings.Clear();using (BinaryReader binaryReader = new BinaryReader(stream, Encoding.UTF8)){int settingCount = binaryReader.Read7BitEncodedInt32();for (int i = 0; i < settingCount; i++){m_Settings.Add(binaryReader.ReadString(), binaryReader.ReadString());}}
}
(5)PlayerPrefsSettingHelper.cs
使用了Unity自带的PlayerPrefs
作为存储方式。
/// 从指定游戏配置项中读取字符串值。
public override string GetString(string settingName, string defaultValue)
{return PlayerPrefs.GetString(settingName, defaultValue);
}/// 向指定游戏配置项写入字符串值。
public override void SetString(string settingName, string value)
{PlayerPrefs.SetString(settingName, value);
}
三、后记
如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。
你的点赞就是对博主的支持,有问题记得留言:
博主主页有联系方式。
博主还有跟多宝藏文章等待你的发掘哦:
专栏 | 方向 | 简介 |
---|---|---|
Unity3D开发小游戏 | 小游戏开发教程 | 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。 |
Unity3D从入门到进阶 | 入门 | 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。 |
Unity3D之UGUI | UGUI | Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。 |
Unity3D之读取数据 | 文件读取 | 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。 |
Unity3D之数据集合 | 数据集合 | 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。 |
Unity3D之VR/AR(虚拟仿真)开发 | 虚拟仿真 | 总结博主工作常见的虚拟仿真需求进行案例讲解。 |
Unity3D之插件 | 插件 | 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等 |
Unity3D之日常开发 | 日常记录 | 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等 |
Unity3D之日常BUG | 日常记录 | 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。 |