存档与读档功能

举例:

  • 传统RPG游戏(仙剑、空之轨迹):
    1.角色信息(生命值,等级)
    2.道具信息(装备,药品)
    3.场景信息(场景名称、角色坐标)
    4.事件信息(任务相关)

  • 关卡类游戏:关卡的通关情况
  • 一些特殊的存档机制(漫漫长夜、亿万僵尸)

Unity中使用的存档方式

一、PlayerPrefs:数据持久化方案

官方手册

  1. 原理:采用键值对的方式对数据进行存储---保存在本地文件(不同操作系统存储路径不同)中,然后程序可以根据这个名称取出上次保存的数值)

  2. 储存类型:可以存储Int, Float, String类型的数据。
  3. 使用例子

//存储数据:
PlayerPrefs.SetInt("Index",1);
PlayerPrefs.SetFloat("Height",183.5f);
PlayerPrefs.SetString("Name","Tom");
//获取数据:
PlayerPrefs.GetInt("Index");

二、存储数据序列化

  • Serialization(序列化),可以用来将对象转化为字节流。
  • Deserialization(反序列化),可以用来将字节流转换为对象。
  • 常见的数据序列化方法:二进制方法,XML方法,JSON方法
  • 存储在:内存、文件、数据库--可存于本地或云

++下面以实例说明++:

Save类--用于保存信息

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[System.Serializable]
public class Save{//怪物位置public List<int> livingTargetPositions = new List<int>();//怪物类型public List<int> livingMonsterTypes = new List<int>();//得分情况public int shootNum = 0;public int score = 0;
}
  1. 二进制存储(Binary Formatter)
  • 序列化:新建或打开一个二进制文件,通过二进制格式器将对象写入该二进制文件。
  • 反序列化:打开待反序列化的二进制文件,通过二进制格式器将文件解析成对象。
//二进制方法:存档和读档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")){//TODO: 提示保存成功}}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); //将保存的信息类初始游戏//TODO: 提示存档不存在或为空,读取成功}else{//TODO: 提示存档不存在或为空,读取失败}}
  1. Json存储
  • JSON:是一种语言无关的发送和接收数据的常用格式。可以使用它来跨平台的传输数据。
  • JSON序列化:
graph LR
对象-->JSON
  • JSON反序列化:
graph LR
JSON-->对象
//JSON:存档和读档private void SaveByJson(){Save save = CreateSaveGO();string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";//利用JsonMapper将save对象转换为Json格式的字符串string saveJsonStr = JsonMapper.ToJson(save);//将这个字符串写入到文件中//创建一个StreamWriter,并将字符串写入文件中StreamWriter sw = new StreamWriter(filePath);sw.Write(saveJsonStr);//关闭StreamWritersw.Close();//TODO: 提示保存成功}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);//将保存的信息类初始游戏//TODO: 提示存档不存在或为空,读取成功}else{//TODO: 提示存档不存在或为空,读取失败}}

存储效果:

{"livingTargetPositions":[0,1,2,4,5,8],"livingMonsterTypes":[2,1,2,0,3,0],"shootNum":18,"score":9
}
  1. XML存储

XML:扩展标记语言,用于标记电子文件使其具有结构性的标记语言。

  • 可以用来标记数据、定义数据类型。
  • 序列化与反序列化的方式与二进制方法十分类似。

XML与Json的区别

//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), 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")){//TODO: 提示保存成功}}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 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);//将保存的信息类初始游戏//TODO: 提示存档不存在或为空,读取成功}else{//TODO: 提示存档不存在或为空,读取失败}}

存储效果:

<save name="saveFile1"><target><targetPosition>0</targetPosition><monsterType>1</monsterType></target><target><targetPosition>1</targetPosition><monsterType>3</monsterType></target><target><targetPosition>3</targetPosition><monsterType>3</monsterType></target><target><targetPosition>4</targetPosition><monsterType>0</monsterType></target><target><targetPosition>6</targetPosition><monsterType>3</monsterType></target><target><targetPosition>7</targetPosition><monsterType>0</monsterType></target><shootNum>50</shootNum><score>29</score>
</save>
  1. 三种存储方式的对比
  • 二进制方法:简单,但可读性差。
  • XML:可读性强,但是文件庞大,冗余信息多。
  • JSON:数据格式比较简单,易于读写,但是不直观,可读性比XML差。
  1. 本地存储位置补充--关于Application.dataPath
  • 编辑模式下为Assets文件夹,其他:
    Unity3D各平台Application.dataPath的路径

转载于:https://www.cnblogs.com/JoharWong/p/9867394.html

SaveLoad--Unity存档读档的学习总结相关推荐

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

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

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

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

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

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

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

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

  5. [Unity存档系统]简单介绍Unity常见存档系统二JSON以及使用方法

    学习目标: 如果你和我同样苦恼于游戏相关的数据怎么存储与读取,那么不妨看看这个up主有关Unity存档系统的教程.[Unity] 存档系统 Part 1 | PlayerPrefs | Unity初学 ...

  6. c++游戏小技巧2:存读档

    <好久没更了>,今天难得有时间,更篇小技巧. 粥锁粥之,<一些游戏没有存档,当你玩到满级时,可能会很尴尬> 为了避免尴尬 流这种东西脱颖而出 ----------------  ...

  7. Unity游戏存档与读档

    目前unity常见存档和读档有几种方式,也就是常见的存储数据的方式(注意存档和读档都是针对单机游戏而言的,角色信息,道具信息,关卡情况等) Unity存档的方式大概分为这两大类 图片来源自siki学院 ...

  8. Unity中采用JSON进行存档和读档

    在利用JSON做存档和读档之前,首先要在Assets导入一个脚本!这个脚本就是LitJson.dll 然后在Unity中首先创建一个Save脚本,用于保存游戏中相关的信息,在这里我存储的是游戏中怪物的 ...

  9. C++ 关于存档与读档

    c++可以用来制作游戏.可是,如果制作的游戏不能存档,那就特别让人心疼了.这种的游戏通常都是辛辛苦苦玩了半天,好不容易打出的记录,程序重启后,一夜回到解放前. 看着宝贵的血汗数据就这样变为0,小凤我决 ...

最新文章

  1. MyEclipse2017在线安装SVN
  2. java.library.path属性在代码中设置不生效问题
  3. unity 飞机 残骸模型_训练残骸模式– Java 8中的改进实现
  4. 04-树7 二叉搜索树的操作集 (30 分)
  5. Java学习之斐波那契数列实现
  6. linux的基础知识——协议和网络应用程序设计模式
  7. C++笔记-using的进一步用法
  8. 职称计算机 高级会计,高级会计《职称计算机》网络应用:Windows防火墙
  9. BZOJ.4909.[SDOI2017]龙与地下城(正态分布 中心极限定理 FFT Simpson积分)
  10. Python使用for循环打印直角三角形
  11. JDK 中的证书生成和管理工具 keytool
  12. 系统学习机器学习之线性判别式(二)
  13. 6-汇编语言中段的使用+dw+start标号
  14. XP SP3多数功能借鉴Vista 安装将无需密码
  15. 苹果7系统更新12无服务器,别再为苹果手机无法更新系统犯难,这几种方式帮你解决!...
  16. BMZCTF misc1
  17. RTP payload format for VP9 video
  18. Android图片颜色混合算法
  19. 使用python实现短信,邮箱的功能
  20. 空间命名的定义及使用:using namespace std 的用法详解

热门文章

  1. 程序开发语言的应用领域
  2. 如何让接口性能提升?
  3. xp安装java_在WindowsXP中,如何安装JAVA软件?
  4. VB源码之友终于开发完毕了
  5. 【牛客刷题】-- 围棋
  6. 将一个文件复制到另外一个文件中
  7. 【Python】阶乘实例,输入1个正整数,计算阶乘
  8. 荷兰国旗、quillksort
  9. linux用root权限执行命令,Linux root权限获取之sudo命令详解
  10. ArcGIS经纬网不穿过图层的具体设置步骤