此文内容源自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. Codeforces Round #410 (Div. 2)

    Codeforces Round #410 (Div. 2) A B略..A没判本来就是回文WA了一次gg C.Mike and gcd problem 题意:一个序列每次可以把\(a_i, a_{i ...

  2. HDU 4349 Xiao Ming's Hope [Lucas定理 二进制]

    这种题面真是够了......@小明 题意:the number of odd numbers of C(n,0),C(n,1),C(n,2)...C(n,n). 奇数...就是mod 2=1啊 用Lu ...

  3. BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 466[Submit][Statu ...

  4. BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1613  Solved: 839[Submit][St ...

  5. JS 特殊字符的验证的问题

    个人的JS 的收集方便下次的使用做百度查询: 1. 特殊字符的验证: var pattern = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].&l ...

  6. 01 Mybatis 的配置和使用

    一.Mybatis 是什么 MyBatis 是一个支持普通SQL查询.存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装.MyB ...

  7. hdfs文件按修改时间下载

    应用于:对于不同用户创建的表目录,进行文件的下载,程序中执行hadoop cat命令 下载文件到本地,随后通过ftp传至目标服务器,并将hdfs文件目录的修改时间存入mysql中.每次修改前将mysq ...

  8. POJ 1023 The Fun Number System

    Description In a k bit 2's complement number, where the bits are indexed from 0 to k-1, the weight o ...

  9. CENTOS6.6下mysql5.7.11带boost和不带boost的源码安装

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn Mysql5.7版本更新后有很多变化,比如json等,连安装都有变化 ...

  10. 彻底理解 Android 中的阴影

    如果我们想创造更好的 Android App,我相信我们需要遵循 Material Design 的设计规范.一般而言,Material Design 是一个包含光线,材质和投影的三维环境.如果我们想 ...