11.20闲话-存档

news/2024/11/20 19:51:46/文章来源:https://www.cnblogs.com/QEDQEDQED/p/18559111

存档

参考

使用没有存档的软件,就像吃饭不给容器一般。

故存档必然是极为重要的。

下面介绍Unity的几种存档方式。

代码出处

Part.1——PlayerPrefs

应该是最简单的存档方式。

但局限性也是显然的,只能存储int, float, string 三种类型,就像在文件中存储了三个map <string, int / float / string>

PlayerPrefs.SetInt("田所浩二", 114514); // 存
PlayerPrefs.SetString("涛哥", "原神");string players_id = PlayerPrefs.GetString("涛哥"); // 读

Part.2——存储数据序列化

分为三种:二进制方法、XML方法、JSON方法,各有千秋。

大体就是

序列化 对象 -> 字节流

反序列化 字节流 -> 对象

先创建一个Save类,用于记录需要保存的东西

public class Save
{public List <string> HZOI_name = new List <string>();public int id;
}

1. 二进制方式

使用二进制文件进行序列化与反序列化

private void Save_By_Bin()
{Save save = Create_Save();BinaryFormatter bf = new BinaryFormatter(); // 创建二进制格式化进程FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt"); // 创建文件流bf.Serialize(fileStream, save);fileStream.Close(); // 关闭if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt")){Debug.Log("保存成功");}
}private void Load_By_Bin()
{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)bf.Deserialize(fileStream);fileStream.Close();Set_Game(save);Debug.Log("成功");}else{Debug.Log("What are you doing?");}
}

2. JSON方法

使用JSON进行序列化与反序列化

//JSON:存档和读档
private void SaveByJson()
{Save save = Create_Save();string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";//利用JsonMapper将save对象转换为Json格式的字符串string saveJsonStr = JsonMapper.ToJson(save);//将这个字符串写入到文件中//创建一个StreamWriter,并将字符串写入文件中StreamWriter sw = new StreamWriter(filePath);sw.Write(saveJsonStr);sw.Close();if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt")){Debug.Log("保存成功");}
}private void LoadByJson()
{ string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";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);//将保存的信息类初始游戏Debug.Log("成功");}else{Debug.Log("What are you doing?");}
}

XML方法

//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.livingTargetPositions.Count; i++){target = xmlDoc.CreateElement("target");targetPosition = xmlDoc.CreateElement("targetPosition");//设置InnerText值targetPosition.InnerText = save.livingTargetPositions[i].ToString();monsterType = xmlDoc.CreateElement("monsterType");monsterType.InnerText = save.livingMonsterTypes[i].ToString();//设置节点间的层级关系 root -- target -- (targetPosition, monsterType)target.AppendChild(targetPosition);target.AppendChild(monsterType);root.AppendChild(target);}//设置射击数和分数节点并设置层级关系  xmlDoc -- root --(target-- (targetPosition, monsterType), id, score)XmlElement id = xmlDoc.CreateElement("id");id.InnerText = save.id.ToString();root.AppendChild(id);xmlDoc.AppendChild(root);xmlDoc.Save(filePath);if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt")){Debug.Log("保存成功");}
}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.livingTargetPositions.Add(targetPositionIndex);XmlNode monsterType = target.ChildNodes[1];int monsterTypeIndex = int.Parse(monsterType.InnerText);save.livingMonsterTypes.Add(monsterTypeIndex);}}XmlNodeList id = xmlDoc.GetElementsByTagName("id");int shootNumCount = int.Parse(id[0].InnerText);save.id = shootNumCount;SetGame(save);//将保存的信息类初始游戏//TODO: 提示存档不存在或为空,读取成功Debug.Log("成功");}else{Debug.Log("What are you doing?");}
}

Part.3 总结

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

JSON方法:可读性好,感觉比较符合人类直觉

XML:冗长,可读性好(?没感觉可读性太好,可能是我太蒻了呜呜呜)

偶然发现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837493.html

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

相关文章

Integrating Streamlit and Langchain data analysis agent-entrance

url:https://www.cnblogs.com/devcxx/p/18550789 一、Streamlit introduce Streamlit is an open-source Python library for quickly building data visualization and interactive web applications. It is specifically designed for data scientists and engineers, using…

WPF的Popup自动显示隐藏

简单实现鼠标移过Popup自动显示和隐藏的功能; 在xaml.cs中实现,首先创建一个定时器,设置300ms的延时:1 DispatcherTimer timer;2 3 public Function1View()4 {5 InitializeComponent();6 7 timer = new DispatcherTimer()…

WPF绑定枚举并且显示特性文本

一、文件结构 二、文件内容 FlattenMethodEnum.cspublic enum FlattenMethodEnum{[Description("单点")]SinglePoint = 0,[Description("平均")]Average = 1,} }EnumBindingSourceExtension.csusing System.Windows.Markup; using System.Diagnostics.Cod…

【知识库搭建】提高企业知识管理和服务效率

在当今信息爆炸的时代,企业知识管理的重要性日益凸显。有效的知识管理不仅能够促进内部信息共享,提升团队协作效率,还能增强企业的核心竞争力。本文将探讨如何通过搭建知识库系统,特别是利用HelpLook工具,优化企业知识管理和服务流程,从而提高企业运营效率。 一、知识库搭…

高级程序语言设计第八个个人作业

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第五次作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400231 姓名:袁志华 作业 第11章 12367第12章 12389

人工智能之机器学习基础——贝叶斯(Bayesian Methods)

贝叶斯分类器 贝叶斯分类器是一类基于贝叶斯定理的统计学习方法,广泛应用于分类问题。其核心思想是通过计算后验概率 P(y∣x),将输入样本 x 分类到具有最大后验概率的类别。 1. 贝叶斯定理 贝叶斯定理是概率论中的基本法则,用于描述条件概率的关系: 其中:P(y∣x):在已知…

2024.11.20 NOIP模拟 - 模拟赛记录

异或(xor) 每次所加三角形的范围如图所示:这道题做法较多,我是通过两组差分与前缀和来做的。 首先需要一个三角形差分,使每一次在差分数组中修改时,影响到的范围是一个三角形,比如这样(红色点为 \((x,y)\),即 \((r,c)\)):假设我们真正需要修改的三角形是橙色部分:那…

实时多模态 AI 的 N 种新可能丨实时互动和大模型专场@RTE2024回顾

在本届 RTE2024 大会上,来自产业界和学术界的多位专家深入探讨了实时互动和大模型技术的最新进展及其潜在应用。西湖心辰联合创始人俞佳、声网 AI 算法工程师乔齐、MiniMax 资深音频算法专家张博闻、商汤科技数字文娱解决方案负责人焦文奎以及面壁智能算法 VP 翟忠武等分享了他…

vscode主题美化

vscode 主题美化 主题使用Tokyo Night由于我在用rust的时候发现其对一些变量的颜色不太好看,所以自己又在设置中改了一点"editor.tokenColorCustomizations": {...."[Tokyo Night]": { // or "[Tokyo Night Storm]""textMateRules": […

2024.11.20总结

1本文于 github 博客同步更新。 A: 一个数可以被操作当且仅存在一列的顶部元素为它且存在一列的底部元素为它,初始扫一遍,将合法的元素以顶部所在列为关键字扔到小根堆里,每次找到最小的元素添加,然后检查将新露出来的元素是否存在匹配,若结束时未填完即为无解。 B: 要么…