目前unity常见存档和读档有几种方式,也就是常见的存储数据的方式(注意存档和读档都是针对单机游戏而言的,角色信息,道具信息,关卡情况等)

Unity存档的方式大概分为这两大类

图片来源自siki学院

图片来源自siki学院

第一种:Player Prefs,这是一种键值对的形式,也就是说需要一个键和一个值,键就是用来存放值的,它是储存在注册表中的,由于注册表有限制,并且不安全数据容易被修改,因此常用改方法储存用户设置如音量大小,按键设置等。

使用方法也比较简单,因为是Unity自带的API所以可以直接在脚本中使用,在使用时也比较简单,该类提供了三种方法写入注册表,

分别是PlayerPrefs.SetInt(), PlayerPrefs.SetFloat(),PlayerPrefs.SetString();

void Start(){//这三个是写入注册表PlayerPrefs.SetInt("IsOn", 2);//"IsOn"是键,1是值,它整个是放在注册表中的PlayerPrefs.SetFloat("Voice", 0.5f);PlayerPrefs.SetString("Name", "张三");PlayerPrefs.Save(); //直接调用Set相关方法 只会把数据存到内存里//当游戏结束时,unity会自动把数据存到硬盘中//如果游戏在运行过程中崩溃,数据不会存储到硬盘中//只要调用了该方法,数据就会立即保存。//这三个是获取//PlayerPrefs.GetInt("IsOn",0);这样的意思是获取键IsOn对应的值,如果IsOn键没有就返回0Debug.Log(PlayerPrefs.GetInt("IsOn"));Debug.Log(PlayerPrefs.GetFloat("Voice"));Debug.Log(PlayerPrefs.GetString("Name"));//判断数据是否存在:if (PlayerPrefs.HasKey("IsOn")){Debug.Log("数据存在");}
//删除指定键值对:PlayerPrefs.DeleteKey("year");
//删除所有存储信息:PlayerPrefs.DeleteAll();}

第二种:Binary(二进制):在存储较为复杂的数据,例如关卡信息,得分情况,剩余的子弹数量等公众信息时,可以将需要保存的信息都放在一个Save类中,这样就不用像写文档的形式分开存储(久而久之有可能会忘记数据对应的具体是什么),也比直接放在注册表中的功能要强大(毕竟注册表值存储三种数据类型),因此我们都会用存储类的对象的形式来储存数据(XML,Json同理)

既然要以对象的方式来存储数据,那么首先就需要创建一个新类专门用作储存数据,随后使用BinaryFormatter类将该类序列化后存入硬盘中

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[Serializable]//注意命名空间
public class Save //这是Save类
{//需要存储的具体信息根据自己的要求编写,这里只是举例internal int Score;//得分internal int PlayerLevel;//等级internal string PlayerSikll;//技能internal int PlayerHp;//血量internal int PlayerAp;//蓝量
}
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;//引入二进制转换器的命名空间
using UnityEngine;
using System.IO;public class BinarySave : MonoBehaviour
{void SaveFun()//保存函数,也就是将Save对象转换为字节流的过程{Save BinarySaveObject = new Save();//声明Save对象,记录当前的游戏状态BinarySaveObject.PlayerAp = 100;//这里是直接对Save对象进行赋值,可以写一个函数然后返回值类型为Save类BinarySaveObject.PlayerHp = 5000;BinarySaveObject.PlayerLevel = 9;BinarySaveObject.PlayerSikll = "万雷诀";BinaryFormatter binaryFormatter = new BinaryFormatter();//这相当于一个二进制转换器FileStream fs = File.Create(Application.dataPath + "/StreamingFile" + "/BinaryTxt");//创建就一个文件流binaryFormatter.Serialize(fs, BinarySaveObject);//用二进制转换器的序列化方法把Save对象序列化,参数:创建的文件流和需要序列化的对象fs.Close();//关闭流}void LoadFun()//读档函数{if(File.Exists(Application.dataPath + "/StreamingFile" + "/BinaryTxt"))//这里最好还是判断文件是否存在{//二进制转换器BinaryFormatter bf = new BinaryFormatter();//打开一个文件流FileStream fs = File.Open(Application.dataPath + "/StreamingFile" + "/BinaryTxt", FileMode.Open);//用反序列化将文件流转换为对象Save save = (Save)bf.Deserialize(fs);fs.Close();Debug.Log(save.PlayerAp);//这里同样可以写函数返回值类型为Save类Debug.Log(save.PlayerHp);Debug.Log(save.PlayerLevel);Debug.Log(save.PlayerSikll);}}private void Start(){SaveFun();LoadFun();}
}

第三种:XML

学习XML之前先了解XML的大概格式,用一张例图应该就能明白

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;//引入头文件
using UnityEngine;public class XmlSave : MonoBehaviour
{void Save()//存档函数{Save XmlSaveObject = new Save();XmlSaveObject.PlayerAp = 100;//这里是直接对Save对象进行赋值,可以写一个函数然后返回值类型为Save类XmlSaveObject.PlayerHp = 5000;XmlSaveObject.PlayerLevel = 9;XmlSaveObject.PlayerSikll = "万雷诀";XmlSaveObject.Score = 45;string path = Application.dataPath + "/StreamingFile" + "/ByXml.json";//这是保存的路径//创建Xml文档,首先要有xml的文档才能操作XmlDocument xmlDoc = new XmlDocument();//创建根节点,也就是最外层的节点,这里就以Save对象为例XmlElement root = xmlDoc.CreateElement("Save");//用xml文档创建//设置根节点的值,对象名字为XmlSaveObjectroot.SetAttribute("name", "XmlSaveObject");//这里同样可以写成方法//1.创建子节点,2.并添加其内容,也就是对象中的各个字段并赋值,3.再将其添加到父节点中XmlElement PlayerAp = xmlDoc.CreateElement("PlayerAp");//这是创建子节点PlayerAp.InnerText = XmlSaveObject.PlayerAp.ToString();//这是为子节点添加内容root.AppendChild(PlayerAp);//这是将子节点添加进父节点中XmlElement PlayerHp = xmlDoc.CreateElement("PlayerHp");PlayerHp.InnerText = XmlSaveObject.PlayerHp.ToString();root.AppendChild(PlayerHp);XmlElement PlayerLevel = xmlDoc.CreateElement("PlayerLevel");PlayerLevel.InnerText = XmlSaveObject.PlayerLevel.ToString();root.AppendChild(PlayerLevel);XmlElement PlayerSikll = xmlDoc.CreateElement("PlayerSikll");PlayerSikll.InnerText = XmlSaveObject.PlayerSikll.ToString();root.AppendChild(PlayerSikll);XmlElement Score = xmlDoc.CreateElement("Score");Score.InnerText = XmlSaveObject.Score.ToString();root.AppendChild(Score);xmlDoc.AppendChild(root);//这是设置root为根xmlDoc.Save(path);//将xml文档保存在指定路径}void Load()//加载函数{string path = Application.dataPath + "/StreamingFile" + "/ByXml.json";if (File.Exists(path))//判断文件是否存在{Save XmlSaveObject = new Save();//创建对象//加载XML文档XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load(path);//将硬盘中的xml文档加载到刚创建的xmlDoc中//通过节点名称来获取元素,结果为XmlNodeList类型XmlNodeList SaveObejct = xmlDoc.GetElementsByTagName("Save");//遍历所有的Save(这里因为就一个就遍历一次),并获得Save的子节点和子节点的InnerTextif (SaveObejct.Count != 0)//判断是否为空{foreach(XmlNode tempsave in SaveObejct)//这里因为是获得了Save节点,想要里面的子节点就需要像下面这样{XmlNode PlayerAp = tempsave.ChildNodes[0];//第一个子节点就是PlayerApXmlSaveObject.PlayerAp = XmlConvert.ToInt32(PlayerAp.InnerText);//将第一个子节点的内容赋值给XmlSaveObject对象XmlNode PlayerHp = tempsave.ChildNodes[1];XmlSaveObject.PlayerHp = XmlConvert.ToInt32(PlayerHp.InnerText);XmlNode PlayerLevel = tempsave.ChildNodes[2];XmlSaveObject.PlayerLevel = XmlConvert.ToInt32(PlayerLevel.InnerText);XmlNode PlayerSikll = tempsave.ChildNodes[3];XmlSaveObject.PlayerSikll = PlayerSikll.InnerText;XmlNode Score = tempsave.ChildNodes[4];XmlSaveObject.Score = XmlConvert.ToInt32(Score.InnerText);}}Debug.Log(XmlSaveObject.PlayerAp);Debug.Log(XmlSaveObject.PlayerHp);Debug.Log(XmlSaveObject.PlayerLevel);Debug.Log(XmlSaveObject.PlayerSikll);Debug.Log(XmlSaveObject.Score);}}private void Start(){Save();Load();}
}

第四种:Json:Json的具体讲解看另一篇,该例子使用的是LitJson

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;public class JsonSave : MonoBehaviour
{void Save()//保存函数{Save JsonSaveObject = new Save();//声明Save对象,记录当前的游戏状态JsonSaveObject.PlayerAp = 100;//这里是直接对Save对象进行赋值,可以写一个函数然后返回值类型为Save类JsonSaveObject.PlayerHp = 5000;JsonSaveObject.PlayerLevel = 9;JsonSaveObject.PlayerSikll = "万雷诀";JsonSaveObject.Score = 45;//这里一定要注意需要字段为public权限,不然会导致转换不成功!!!string ObjectStr = JsonMapper.ToJson(JsonSaveObject);//将Save对象序列化为Json类型的字符串string path = Application.dataPath + "/StreamingFile" + "/ByJson.json";//这是保存的路径//对象被转换成了字符串,这个时候还是需要写进文件中,因此StreamWriter writer = new StreamWriter(path);//创建文件流writer.Write(ObjectStr);//写入writer.Close();//关闭文件流       }void Load()//加载函数{//最好做下判断文档是否存在,这里省略了string path = Application.dataPath + "/StreamingFile" + "/ByJson.json";//这是想打开的文件路径StreamReader reader = new StreamReader(path);//创建读取的文件流string ObjectStr = reader.ReadToEnd();//将文本文件中的内容全部读取到字符串中,(json格式其实就算字符串类型)reader.Close();//关闭流Save JsonSaveObject = JsonMapper.ToObject<Save>(ObjectStr);//将json格式转化成对象Debug.Log(JsonSaveObject.PlayerAp);Debug.Log(JsonSaveObject.PlayerHp);Debug.Log(JsonSaveObject.PlayerLevel);Debug.Log(JsonSaveObject.PlayerSikll);Debug.Log(JsonSaveObject.Score);}private void Start(){Save();Load();}
}

Unity游戏存档与读档相关推荐

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

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

  2. Unity游戏存档 (将游戏数据储存至本地文档)

    在Unity中 添加本地文档储存游戏数据 首先我们应该在Unity中创建一个C#脚本,将其命名为Inventory 脚本不用挂在任何物体上,只需要在命名空间之前写一句代码,如下: 代码写好之后保存,在 ...

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

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

  4. unity 游戏存档

    对于简单的存档,可以利用Playerpref永久保存,通过保存游戏角色的位置来实现,然后当点击继续游戏时通过start初始化得到保存的数据,重新开始游戏则不读取数据.大体思路如下:界面上有退出游戏按钮 ...

  5. unity游戏存档playerprefs

    unity中有一个简单的游戏存档类–playerprefs,这个类有什么作用呢? PlayerPrefs是Unity3d提供了一个用于数据本地持久化保存与读取的类.工作原理十分简单,就是以key-va ...

  6. Unity游戏存档-PlayerPrefs类

    对于游戏存档除了XML,Json,Sqlite,unity提供了一个类可以用来存储数据,那就是PlayerPrefs. 这个类对应的API如下 Class Functions类函数 SetInt Se ...

  7. Unity游戏存档的四种方式

    [转载]http://blog.csdn.net/a237653639/article/details/50076755 游戏存档 在Unity中游戏存档有如下四种方式: PlayerPrefs c# ...

  8. Unity 游戏存档框架实现

    最近重构了一下我的存档框架.我在这里对实现方法进行简单的解析.注意这里主要演示算法,所以,效率上并不是最佳.一个游戏中,可能有成百上千个物体需要存储,而且有几十种类型,接下来就用一个简单的例子来解释. ...

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

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

最新文章

  1. python selenium p_Python爬虫(二十一)_Selenium与PhantomJS
  2. mysql trim前后空格_MySQL清除字符串首尾空格函数trim
  3. 接收不到其他机器发来的报文_大厂真实案例:线上四台机器同一时间全部 OOM......
  4. Redis及Spring-Data-Redis入门学习
  5. Dbvisualizer9.0.6 解决中文乱码
  6. oracle nowday,Java MonthDay now()用法及代码示例
  7. 牛客题霸 [拼接所有的字符串产生字典序最小的字符串] C++题解/答案
  8. 计算机图形学画线_在计算机图形学中直接使用线方程
  9. 调用图灵机器人API实现简单聊天
  10. SQL Server 2008存储结构之GAM、SGAM
  11. c++ windows编译器 amd平台_不同操作系统下的C/C++ 编译器,C/C++新手须知,零基础学习C语言...
  12. mysql 建模教程 pdf,PowerDesigner 15 系统分析与建模实战 PDF扫描版[50MB]
  13. 【整理】Ubuntu10.04下安装Altera9.1套件
  14. 【课程·研】自然辩证法 | 课堂汇报:工程师的伦理规范
  15. java integer转成负数_Java 十进制和十六制之间的转化(负数的处理)
  16. Ubuntu下清除DNS缓存的方法
  17. 计算机毕业设计Java东理咨询交流论坛(源码+系统+mysql数据库+lw文档)
  18. linux 命令 ps的作用,Linux之ps命令
  19. Linux学习笔记——系统函数IO
  20. (UPCOJ暑期训练)Tally Counters

热门文章

  1. 武汉大学数据结构MOOC第1周测验
  2. pgsql处理文档类型数据_pgsql_pg的数据类型
  3. Alert The AC power adapter wattage and type cannot be determined. (戴尔电脑开机)
  4. 未定义错误c语言中英文,C语言编程出错英汉提示对照表
  5. Win10系统Chrome浏览器启用独立显卡提升3D程序渲染性能
  6. 战争游戏红龙修改手册
  7. (2018-2021年)Uncertainty 相关SOTA文献笔记整理
  8. 速卖通买家号怎么注册?
  9. 拼多多 2020校园招聘 二维表第k大数(二分)
  10. 华为手机备份的通讯录是什么文件_手机怎么备份通讯录?华为手机备份方法大全...