【GameFramework框架内置模块】16、配置(Setting)

推荐阅读

  • 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接口,DefaultSettingHelperPlayerPrefsSettingHelper就是这些接口的实现类。

这些实现类,通过继承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之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.rhkb.cn/news/286904.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年软件测试,“我“从初级到高级进阶,不再走弯路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 现在2024年&#…

54、Qt/对话框、事件机制相关学习20240325

一、完善对话框&#xff0c;点击登录按钮&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#…

python(django)之单一接口管理功能后台开发

1、创建数据模型 在apitest/models.py下加入以下代码 class Apis(models.Model):Product models.ForeignKey(product.Product, on_deletemodels.CASCADE, nullTrue)# 关联产品IDapiname models.CharField(接口名称, max_length100)apiurl models.CharField(接口地址, max_…

服务运营|香港大学雷骁:收益管理中价格歧视的公平性

编者按&#xff1a; INFORMS George B. Dantzig Dissertation Award 用于表彰运筹学和管理科学领域中具有创新性和实用性的最佳毕业设计。香港大学助理教授雷骁题为“Revenue Management in Video Games and With Fairness” 是这一奖项2023年度的提名者之一。 这篇毕业设计重…

PMSM 永磁同步电机滑膜控制 SVPWM矢量控制 matlab simulink 仿真

仿真搭建平台&#xff1a; (1)该模型采用matlab/simulink 2016b版本搭建&#xff0c;使用matlab 2016b及以上版本打开最佳; (2)该模型已经提前转换了各个常用版本&#xff08;最低为matlab2012b&#xff09;&#xff0c;防止出现提示版本过高的情况。 模型截图&#xff1a; 算…

网游版五子棋

五子棋游戏属于开房间类休闲游戏。可以非常方便实现分布式战斗服横向拓展&#xff0c;只要感觉服务器有压力&#xff0c;可以通过动态加战斗服服务器来实现。本文介绍一个基于jforgame组件开发的五子棋网络小游戏&#xff0c;支持分布式部署战斗服。 1.通信组件 浏览器&#…

Linux:进程概念认识

进程 基本概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核观点&#xff1a;担当分配系统资源&#xff08; CPU 时间&#xff0c;内存&#xff09;的实体。 描述进程 -PCB 进程信息被放在一个叫做进程控制块的数据结构中&#xff0c;可以理解为…

34.基于SpringBoot + Vue实现的前后端分离-足球俱乐部管理系统(项目 + 论文)

项目介绍 系统包含用户、教练、管理员三个角色 用户&#xff1a;登录、注册、查看俱乐部公告信息、查看俱乐部赛事信息、个人中心等教练&#xff1a;登录、个人中心、用户管理、赛事管理、球员数据管理、训练计划管理、公告信息管理等管理员&#xff1a;登录、个人中心、教练…

Harmony OS 网络编程 实验指南

netcat简介 netcat 是什么&#xff1f; netcat是一个非常强大的网络实用工具&#xff0c;可以用它来调试TCP/UDP应用程序&#xff1b; netcat 如何安装&#xff1f; Linux上可以使用发行版的包管理器安装&#xff0c;例如Debian/Ubuntu上&#xff1a; sudo apt-get instal…

day07-缓存商品、购物车

1. 缓存菜品 1.1 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 1.2 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓…

Git_.gitignore文件相关知识

.gitignore 作用&#xff1a;指明不对哪些文件进行版本控制。 应当忽略哪些文件&#xff1f; 系统或软件自动生成的文件编译时产生的中间文件和结果文件运行时产生的日志文件&#xff0c;临时文件和缓存文件涉及身份&#xff0c;密码&#xff0c;口令&#xff0c;秘钥等敏感…

Java——基于CompletableFuture的流水线并行处理

CompletableFuture在JDK1.8提供了一种更加强大的异步编程的api。它实现了Future接口&#xff0c;也就是Future的功能特性CompletableFuture也有&#xff1b;除此之外&#xff0c;它也实现了CompletionStage接口&#xff0c;CompletionStage接口定义了任务编排的方法&#xff0c…

C语言结构体之位段

位段&#xff08;节约内存&#xff09;&#xff0c;和王者段位联想记忆 位段是为了节约内存的。刚好和结构体相反。 那么什么是位段呢&#xff1f;我们现引入情景&#xff1a;我么如果要记录一个人是男是女&#xff0c;用数字0 1表示。我们发现只要一个bit内存就可以完成我们想…

Linux离线安装mysql,node,forever

PS:本文是基于centos7实现的,要求系统能够查看ifconfig和unzip解压命令, 实现无网络可安装运行 首先现在百度网盘的离线文件包****安装Xftp 和 Xshell 把机房压缩包传到 home目录下****解压unzip 包名.zip 获取IP先获取到 linux 主机的ip ifconfig Xftp 连接输入IP,然后按照…

FPGA----ZCU106的petalinux 2019.1使用USB传输数据

1、实际项目中需要用到开发板的串口进行数据交互&#xff0c;之前讲的几节只是启动了网口&#xff08;如下链接&#xff09;。因此&#xff0c;本次给大家带来的官方自带串口例程的使用方法&#xff0c;本文的vivado工程和下述连接一样&#xff0c;PL端什么配置都没有。 FPGA-…

ElasticSearch8 - 基本操作

前言 本文记录 ES 的一些基本操作&#xff0c;就是对官方文档的一些整理&#xff0c;按自己的习惯重新排版&#xff0c;凑合着看。官方的更详细&#xff0c;建议看官方的。 下文以 books 为索引名举例。 新增 添加单个文档 (没有索引会自动创建) POST books/_doc {"n…

flutter 弹窗之系列三

Overlay 部分源码 class Overlay extends StatefulWidget{...static OverlayState of(BuildContext context, {bool rootOverlay false,Widget debugRequiredFor,})... } // rootOverlay: // 值为false, 就近查找&#xff0c;找到树中最近的节点; // 如果为true, 则去找最顶…

数据库专题(oracle基础和进阶)

前言 本专题主要记录自己最近学的数据库&#xff0c;有兴趣一起补习的可以一起看看&#xff0c;有补充和不足之处请多多指出。希望专题可以给自己还有读者带去一点点提高。 数据库基本概念 本模块有参考&#xff1a;数据库基本概念-CSDN博客 数据库管理系统是一个由互相关联的…

[Java基础揉碎]抽象类

目录 通过问题引出 介绍 关键点 细节 ​编辑 抽象类的最佳设计模式--模版设计模式 1.先用最容易想到的方法 2.分析问题&#xff0c;提出使用模板设计模式 通过问题引出 假如我们有个动物类, 动物都有eat吃的方法, 但是具体吃什么, 我们不知道, 因为是什么动物我们不知道…

Git版本控制

这是两个学习Git推荐必看的文档&#xff0c;第一个链接是Git的官方权威文档&#xff0c;第二个链接是国内程序员在开发中&#xff0c;总结的Git快速入门教程&#xff0c;掌握这个&#xff0c;也足够应付在工作中的场景。 Git权威书籍《ProGit》中文版https://gitee.com/progit…