此文内容源自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. ZooKeeper安装(Windows)

    概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关 ...

  2. BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]

    传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...

  3. Windows Server 2016-部署RODC只读域控制器

    只读域控制器Read-Only Domain Controller简称RODC.RODC是Windows Server 2008之后引入的一活动目录特性,与其他域控制器一样包含AD数据库,但RODC默 ...

  4. Selenium_Java版本安装及初试

    [环境] ①JDK版本:jdk1.8.0_73 ②Eclipse:jee-mars-4.5.2 ③Selenium:selenium-java-3.5.3 ④GoogleChrome:60 ⑤chro ...

  5. 设为首页/加入收藏JS代码

    传统网站常用的设为首页/加入收藏js代码 <a href="javascript:void(0)" onclick="sethome(this,window.loc ...

  6. Math.abs(~2018),掌握规律!

    Math.abs(~2018) 这要用到一些计算机的基础知识. Math.abs(x)指的是返回一个数的绝对值,而关键在"~2018",这是取反操作符,故取相反数得结果为-2018 ...

  7. 基于jq的表单填充

    //表单填充 formDataLoad: function (domId, obj) { for (var property in obj) { if (obj.hasOwnProperty(prop ...

  8. 微信小程序 页面跳转传递数据

    点击view 跳转页面 <view class="album_image" data-album-obj="{{item}}" bindtap=" ...

  9. 基于gmap.net制作离线地图下载器

    网上已有大量文章介绍gamp.net和离线下载相关的文章了.我就不在介绍gmap相关的文章了,这里着重介绍一下下载相关原理.其实gmap.net本身已自带下载工能,只是离线图片下载到sqlit中,现将 ...

  10. linux 管理权限

    linux 管理权限 linux 文件 权限 1.使用 ls -l 命令 执行结果如下(/var/log) : drwxr-x--- 2 root adm 4096 2013-08-07 11:03 ...