此文内容源自siki学院视频,仅供学习!视频链接地址:http://www.sikiedu.com/course/129

工程使用Unity 2017.3.0f3 (64-bit)

老司机读博客,了解存档读档主体实现方式即可,仅供借鉴参考,菜鸟可以去文章结尾下载源码,或者去上面的链接直接观看视频。。。。。

首先,创建一个Save类用于保存数据

[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;
}

方式一:二进制方法

存档

private void SaveByBin()
{
  //序列化过程(将save对象转换为字节流)
  //创建save对象并保存当前游戏状态
  Save save = CreateSaveGO();
  //创建一个二进制格式化程序
  BinaryFormatter bf = new BinaryFormatter();
  //创建一个文件流
  path = Application.dataPath + "/StreamingFile" + "/byBin.txt";
  FileStream fileStream = File.Create(path);

  //用二进制格式化程序的序列化方法来序列化Save对象,参数:创建的文件流和需要序列化的对象
  bf.Serialize(fileStream, save);
  //关闭流
  fileStream.Close();

  //即时刷新Project工程文件
  AssetDatabase.Refresh();
}

读档

private void LoadByBin()
{
  path = Application.dataPath + "/StreamingFile" + "/byBin.txt";
  //反序列化过程
  //创建一个二进制格式化程序
  BinaryFormatter bf = new BinaryFormatter();
  //打开一个文件流
  FileStream fileStream = File.Open(path,FileMode.Open);
  //调用格式化程序的反序列化方法,将文件流转换为一个save对象
  Save save = bf.Deserialize(fileStream) as Save;
  //关闭文件流
  fileStream.Close();
}

方式二:Xml

存档

private void SaveByXml()
{
  Save save = CreateSaveGO();
  //创建Xml文件的存储路径
  path = Application.dataPath + "/StreamingFile" + "/byXml.xml";
  //创建XML文档
  XmlDocument xmlDoc = new XmlDocument();
  //创建根节点,即最上层节点
  XmlElement root = xmlDoc.CreateElement("save");
  //设置根节点中的值
  root.SetAttribute("name", "saveFile1");

  XmlElement target;
  XmlElement targetPosition;
  XmlElement monsterType;

  for (int i = 0; i < save.livingTargetPositions.Count; i++)
  {
    target = xmlDoc.CreateElement("target");
    targetPosition = xmlDoc.CreateElement("targetPosition");
    //设置节点的值
    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,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(path);
  AssetDatabase.Refresh();
}

读档

private void LoadByXml()
{
  path = Application.dataPath + "/StreamingFile" + "/byXml.xml";Save save = new Save();

  //加载XML文档
  XmlDocument xmlDoc = new XmlDocument();
  xmlDoc.Load(path);

  //通过节点名称来获取元素,结果为XmlNodeList类型
  XmlNodeList targets = xmlDoc.GetElementsByTagName("target");
  //遍历节点所有的target节点,并获得子节点和子节点的InnerText
  if (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);
}

方式三:Json(LitJson)

存档

private void SaveByJson()
{
  Save save = CreateSaveGO();
  path = Application.dataPath + "/StreamingFile" + "/byJson.json";
  //利用JsonMapper将save对象转换为Json格式的字符串
  string saveJsonStr = JsonMapper.ToJson(save);
  //将这个字符串写入到文件中
  //创建一个StreamWriter,并将字符串写入
  StreamWriter sw = new StreamWriter(path);
  sw.Write(saveJsonStr);
  //关闭写入流
  sw.Close();
  AssetDatabase.Refresh();
}

读档

private void LoadByJson()
{
  path = Application.dataPath + "/StreamingFile" + "/byJson.json";
  //创建一个StreamReader,用来读取流
  StreamReader sr = new StreamReader(path);
  //将读取到的流赋值给saveJsonStr
  string saveJsonStr = sr.ReadToEnd();
  sr.Close();
  //将字符串转换为Save对象
  Save save = JsonMapper.ToObject<Save>(saveJsonStr);
  SetGame(save);
}

附上工程源码和LitJson库,有时间的童鞋可以去siki学院观看视频,良心推荐,真的不错!

链接:https://pan.baidu.com/s/1IOa2Dw06tMSC-hlngAk5-w 密码:glps

Unity开发之存档和读档的三种实现方式的更多相关文章

  1. PHP生成word文档的三种实现方式

    PHP生成word原理 利用windows下面的 com组件 利用PHP将内容写入doc文件之中 具体实现: 利用windows下面的 com组件 原理:com作为PHP的一个扩展类,安装过offic ...

  2. js介绍,js三种引入方式,js选择器,js四种调试方式,js操作页面文档DOM(修改文本,修改css样式,修改属性)

    js介绍 js运行编写在浏览器上的脚本语言(外挂,具有逻辑性) 脚本语言:运行在浏览器上的独立的代码块(具有逻辑性) 操作BOM 浏览器对象盒子 操作DOM 文本对象 js三种引入方式 (1)行间式: ...

  3. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  4. servlet三种实现方式之三通过继承HttpServlet开发servlet

    servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第三种: import java.io.*; i ...

  5. [转]PHP开发中涉及到emoji表情的三种处理方法

    最近几个月做微信开发比较多,存储微信昵称必不可少,可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一 ...

  6. 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解

    1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...

  7. Android开发——View滑动的三种实现方式

    0. 前言   Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验.一般View的滑动可以用三种方式实现. 转载请注明出处:http://blog.csdn.net/seu ...

  8. Solon 开发,四、Bean 扫描的三种方式

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  9. Java开发学习(四)----bean的三种实例化方式

    一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下:    二. ...

随机推荐

  1. LongAdder基础

    LongAdder是JDK8中并发包中的一个新类,和AtomicLong都使用CAS,但是性能比AtomicLong更好. LongAdder在AtomicLong的基础上进行了热点分离,热点分离类似 ...

  2. Java多线程基础(二)

    信号量Semaphore,类似于锁的功能,用于多线程中对一组资源的控制. acquire方法用于尝试获取一个资源,未获取前将一直等待.release用于释放一个资源,release的前提是已经获得了一 ...

  3. BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1070  Solved: 596[Submit][Status] ...

  4. iterator和for of 循环

    JavaScript 原有的表示"集合"的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就有了四种数据集合,用户还可以组合使用它们, ...

  5. 发放春节福利,ASP.NET Core断点续传

    ASP.NET Core断点续传 在ASP.NET WebAPi写过完整的断点续传文章,目前我对ASP.NET Core仅止于整体上会用,对于原理还未去深入学习,由于有园友想看断点续传在ASP.NET ...

  6. VS2012以后版本MFC程序发布记录,支持XP

    ##概述 自从VS2012之后,增加了新的VC运行时库,而一般用户机器上不一定有对应的版本的运行时库,所以微软官方给出的方案是需要用户安装对应版本的VisualC++Redistributable P ...

  7. 引用MinGW生成的.dll.a后出现的问题

    以前很少调用MinGW的运行时库,现在用到一个项目,用到了glib和gettext等. 遇到了一个问题,折腾了一个下午. gettext的运行时库之一是intl,MinGW只提供了.dll.a,于是参 ...

  8. .NET图表控件(LightningChart )的用法

    概述 LightningChart (LightningChart Ultimate) 软件开发工具包是微软Visual Studio 的一个插件,专攻大数据可视化呈现问题,用于 WPF(Window ...

  9. PHPUnit-附录 B. 标注

    [http://www.phpunit.cn/manual/5.7/zh_cn/appendixes.annotations.html] 所谓标注,是指某些编程语言中允许加在源代码中的一种特殊格式的语 ...

  10. 面试陷阱1:Integer类型的比较

    public class Test01 { public static void main(String[] args) { Integer f1 = 100, f2 = 100, f3 = 150, ...