一、PlayerPrefs:数据持久化方案

常见的方法如下:

// PlayerPrefs读取
PlayerPrefs.GetInt("123asd");       // 如果我们之前没有过这个键,那么返回默认值就是0
PlayerPrefs.GetFloat("asd");        // 如果我们之前没有过这个键,那么返回默认值就是0
PlayerPrefs.GetString("123");       // 如果我们之前没有过这个键,那么返回默认值就是Null
​
// 我们是可以修改方法返回的默认值的,另外两个API同理
// 我们通常可以使用在玩家基础数据初始化
PlayerPrefs.GetInt("zzz", 100);     // 如果我们之前没有过这个键,那么返回默认值就是100
​
// PlayerPrefs判断数据是否存在
PlayerPrefs.HasKey("XXX");
​
// PlayerPrefs删除数据
PlayerPrefs.DeleteKey("XXX");       // 删除指定键值对的数据
PlayerPrefs.DeleteAll();            // 删除所有键值对的数据

参考功能及代码:

通过单选框是否被勾选上,从而来决定是否播放背景音乐,代码如下:

using UnityEngine.UI;
public class MusicManager : MonoBehaviour
{// 音乐开关单选框  和 播放背景音乐的 musicAudio 组件public Toggle musicToggle;public AudioSource musicAudio;private void Awake(){if (PlayerPrefs.HasKey("MusicOn")){if (PlayerPrefs.GetInt("MusicOn") == 1){//  当 单选框 勾选时, 激活 musicAudio 组件musicToggle.isOn = true;musicAudio.enabled = true;}else{//  当 单选框 未勾选时, 让 musicAudio 组件失活musicToggle.isOn = false;musicAudio.enabled = false;}}else{musicToggle.isOn = true;}}private void Update(){MusicSwitch();}private void MusicSwitch() {// 通过单选框是否被勾选上,从而来决定是否播放背景音乐if (musicToggle.isOn == false){musicAudio.enabled = false;//   保存音乐开关的状态,   0代表暂停 1 代表播放PlayerPrefs.SetInt("MusicOn",0);  }else {musicAudio.enabled = true;PlayerPrefs.SetInt("MusicOn", 1);}PlayerPrefs.Save();}
}

二、二进制存储(字节流存储)

序列化:新建或打开一个二进制文件,通过二进制格式器将对象写入该二进制文件。

反序列化:打开待反序列化的二进制文件,通过二进制格式器将文件解析成对象。

参考代码如下:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
// 这两个命名空间需添加// 二进制方法:存档和读档private void SaveByBin() {// 序列化过程 (将Save 对象转换为字节流)// 创建Save 对象 并 保存当前游戏状态 Save save = CreateSaveGO();// 创建一个二进制格式化程序BinaryFormatter bf = new BinaryFormatter();// 创建一个文件流FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");// 用二进制格式化程序的序列化方法 来 序列化Save对象//      参数:创建的文件流和需要序列化的对象bf.Serialize(fileStream,save);// 关闭流fileStream.Close();// 如果文件存在,则显示保存成功if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt")) {UIManager._Instance.ShowMessage("保存成功!");}}private void LoadByBin() {if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt")){// 反序列化过程// 创建一个二进制格式化程序BinaryFormatter bf = new BinaryFormatter();// 打开一个文件流FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile" + "/byBin.txt", FileMode.Open);// 调用格式化程序的反序列化方法,将文件流转换为Save 对象Save save = (Save)bf.Deserialize(fileStream);// 关闭文件流fileStream.Close();SetGame(save);UIManager._Instance.ShowMessage(" ");}else { UIManager._Instance.ShowMessage("存档文件不存在!");}}

三、json存储

JSON序列化:对象 ——> JSON

JSON反序列化:JSON ——> 对象

参考代码如下:

using LitJson;
// 此命名空间需添加// Json:  存档和读档private void SaveByJson(){Save save = CreateSaveGO();string filePath = Application.dataPath + "/StreamingFile" + "/byJson.txt";// 利用 JsonMapper 将save 对象转换Wie Json 格式的字符串string saceJsonStr = JsonMapper.ToJson(save);// 将这个字符串写入到文件中// 创建一个StreamWriter,并将字符串写入文件中StreamWriter sw = new StreamWriter(filePath);sw.Write(saceJsonStr);// 关闭 StreamWritesw.Close();UIManager._Instance.ShowMessage("保存成功!");}private void LoadByJson() {string filePath = Application.dataPath + "/StreamingFile" + "/byJson.txt";if (File.Exists(filePath)){// 创建一个 StreamReader, 用来读取流StreamReader sr = new StreamReader(filePath);// 将读取到的流赋值给 jsonStrstring jsonStr = sr.ReadToEnd();// 关闭sr.Close();// 将字符串jsonStr 转换为Save 对象Save save = JsonMapper.ToObject<Save>(jsonStr);SetGame(save);UIManager._Instance.ShowMessage(" ");}else {UIManager._Instance.ShowMessage(" 存档文件不存在!");}}

注:需先导入该文件再添加(using LitJson;)命名空间,LitJson文件存于百度网盘链接:https://pan.baidu.com/s/1Wor_lltGnGbbBmD2T0Dtqg 
提取码:wdrf

四、XML存储

扩展标记语言,用于标记电子文件使其具有结构性的标记语言。 可以用来标记数据、定义数据类型。 序列化与反序列化的方式与二进制方法十分类似。

参考代码如下:

using System.Xml;
//需要添加该命名空间
// Xml:  存档和读档private void SaveByXml() {Save save = CreateSaveGO();// 创建Xml 文件的存储路径string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";// 创建XML 文档XmlDocument xmlDoc = new XmlDocument();// 创建根节点, 即最上层节点XmlElement root = xmlDoc.CreateElement("save");// 设置根节点中的值root.SetAttribute("name","saveFile1");// 创建XmlElementXmlElement target;XmlElement targetPosition;XmlElement monsterType;// 遍历 save中存储的数据,将数据转换成XML格式for (int i =0; i < save.livingTargetPointions.Count;i++) {target = xmlDoc.CreateElement("target");targetPosition = xmlDoc.CreateElement("targetPosition");// 设置 InnerText 值targetPosition.InnerText = save.livingTargetPointions[i].ToString();monsterType = xmlDoc.CreateElement("monsterType");monsterType.InnerText = save.livingMonsterTypes[i].ToString();// 把节点一层层的添加至 XMLDoc 中,请仔细看他们之间的先后顺序,这将是生成XML 文件的顺序// 设置节点间的层级关系 root ---- target ---- (targetPosition,monsterType)target.AppendChild(targetPosition);target.AppendChild(monsterType);root.AppendChild(target);}// 设置射击数和分数节点  并设置层级关系  xmlDoc---- root----(//  target---- (targetPosition,monsterType), shootNum , score);XmlElement shootNum = xmlDoc.CreateElement("shootNum");shootNum.InnerText = save.shootNum.ToString();root.AppendChild(shootNum);XmlElement score = xmlDoc.CreateElement("score");score.InnerText = save.score.ToString();root.AppendChild(score);xmlDoc.AppendChild(root);xmlDoc.Save(filePath);if (File.Exists(Application.dataPath + "/StreamingFile" + "/byXML.txt")) { UIManager._Instance.ShowMessage("保存成功!");}}private void LoadByXml() {string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";if (File.Exists(filePath)){Save save = new Save();// 加载XML 文档XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(filePath);// 通过节点名称来获取元素,结果为XmlNodeList类型XmlNodeList targets = xmlDoc.GetElementsByTagName("target");// 遍历所有的 target 节点,并获取子节点和子节点的InnerTextif (targets.Count != 0) {foreach (XmlNode target  in targets) {XmlNode targetPosition = target.ChildNodes[0];int targetPositionIndex = int.Parse(targetPosition.InnerText);// 把得到的值存储到 save 中save.livingTargetPointions.Add(targetPositionIndex);XmlNode monsterType = target.ChildNodes[1];int monsterTypeIndex = int.Parse(monsterType.InnerText);save.livingMonsterTypes.Add(monsterTypeIndex);}}// 得到存储的射击数XmlNodeList shootNum = xmlDoc.GetElementsByTagName("shootNum");int shootNumCount = int.Parse(shootNum[0].InnerText);save.shootNum = shootNumCount;XmlNodeList score = xmlDoc.GetElementsByTagName("score");int scoreCount = int.Parse(score[0].InnerText);save.score = scoreCount;SetGame(save);UIManager._Instance.ShowMessage(" ");}else {UIManager._Instance.ShowMessage("存档文件不存在");}}

后三种方法优缺点对比:

二进制方法:简单,但可读性差。

XML:可读性强,但是文件庞大,冗余信息多。

JSON:数据格式比较简单,易于读写,但是不直观,可读性比XML差。

参考链接:Unity中使用的四种存档和读档方式_Wisdom_off的博客-CSDN博客_unity 存档

Unity 常用的几种存档读档方式相关推荐

  1. Unity_二进制,Jason,XML存档读档

    创建一个类Save 用来保存游戏的信息,以便于存档 Save.cs的代码 using System.Collections; using System.Collections.Generic; usi ...

  2. 正版七日杀服务器存档,七日杀网吧怎么存档 七日杀网吧存档读档方法介绍-游侠网...

    七日杀的电脑要求配置虽然不是特别高,但是相对于很多玩家的电脑来说还是一个不小的负担的,所以很多玩家会选择去网吧游玩,但是很多玩家发现网吧非主机玩家的人物数据重进总是清零.所以今天小编就为大家带来了便是 ...

  3. Python 名片管理系统(文件版,可存档读档)

    Python 名片管理系统(文件版,可存档读档) 相比于函数版的程序,文件版增加了存档读档操作 函数版的可以参考Python名片管理系统(列表.字典和函数的综合应用) 以下是新增部分的代码(不包括调用 ...

  4. 常用的四种免费证书申请方式

    免费申请证书的四种常用方式 1. Let's Encrypt 申请教程 2.Cloudflare 申请教程 3.FreeSSL 申请教程 4. 阿里云(云厂商提供)免费证书 申请教程 1. Let's ...

  5. TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable

    TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable 目录 输出结果 代码设计 输出结果 代码设计 # tensorflow中的两种定义scope(命 ...

  6. SaveLoad--Unity存档读档的学习总结

    存档与读档功能 举例: 传统RPG游戏(仙剑.空之轨迹): 1.角色信息(生命值,等级) 2.道具信息(装备,药品) 3.场景信息(场景名称.角色坐标) 4.事件信息(任务相关) 关卡类游戏:关卡的通 ...

  7. 游戏服务器之存档读档

    设计上: (1)存档方式 定时器在一定范围的分钟内随机存档一次,为了避免集中式存档 第一次需要全部存档一次,因为需要存档版本字段 分标签实时存档设置了标签的数据,减少每次存档数据 (2)压缩处理 档案 ...

  8. 51单片机下载完程序后不亮_程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍...

    单片机是一种可编程控制器,搭好硬件电路后,可以利用程序实现很多非常复杂的逻辑功能,与纯硬件电路相比,简化了硬件外围的设计.方便了逻辑的设计.丰富了逻辑的输出.不同厂家的单片机需要不同编程IDE来实现编 ...

  9. 程序如何下载到单片机中?单片机常用的四种烧写程序方式介绍

    单片机是一种可编程控制器,搭好硬件电路后,可以利用程序实现很多非常复杂的逻辑功能,与纯硬件电路相比,简化了硬件外围的设计.方便了逻辑的设计.丰富了逻辑的输出.不同厂家的单片机需要不同编程IDE来实现编 ...

  10. 常用的几种清除浮动的方式

    为什么要清除浮动?清除浮动主要为了解决父级元素因为子级浮动引起内部高度为0 的问题.下面介绍四种清除浮动的方式: 1.额外标签法 使用方法:在浮动元素末尾添加一个空标签. 例如: <div st ...

最新文章

  1. 在ISA 2006标准版上定制带宽和限制流量(测试)
  2. android seekbar闪退,android seekbar 踩坑之路
  3. mysql php宝塔 root_宝塔面板,脚本命令
  4. 基于Vue+Vue-Router+Vuex+Element-ui+axios,高仿小米商城,实现的电商项目
  5. js 中断函数执行_js如何中断递归函数
  6. c++冒泡排序_python+C、C++混合编程的应用
  7. 锐捷云教室 服务器型号,锐捷智慧云课堂方案(云教室+简单)
  8. 《CSS权威指南》读书笔记4
  9. MPP集群基本概念和搭建
  10. 绕过AppLocker系列之控制面板的利用
  11. 攻防演练怎样防止个人信息泄露
  12. 华硕主板VMware中安装Ubuntu16.04中的BIOS设置问题
  13. 高端运动耳机哪个品牌最好、最好的运动耳机品牌排行
  14. 如何使用vue开发公众号网页
  15. 红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?
  16. Linux如何更改root用户密码
  17. dnw for linux(pc)
  18. 调用http时因为js问题遇到的一个报错
  19. 讯飞——机器翻译,iOS的webapi接入教程
  20. 2021年中国Wifi智能电源插座市场趋势报告、技术动态创新及2027年市场预测

热门文章

  1. adb命令启动某个action_各种启动命令
  2. Nrf51xxx Bluetooth Related
  3. Navicat:Access violation at address xxxxxxxxx in module 'navicat.exe'.Read of address xxxxxx
  4. 归去来兮辞 陶渊明
  5. “趁年轻,浙样爱”陈晓景甜领衔春日恋爱宣言
  6. Field not found; typically this occurs with arrays which are not mapped as single value
  7. 计算机中的标准差是哪个英语单词,标准差是什么意思
  8. linux sox录音时间控制,Linux 对音频万能处理的命令——SOX
  9. U盘量产后USB鼠标和键盘都无法使用,如何解决?
  10. Android 获取应用「唯一标识符」——DeviceID「兼容android 10(Q)」