Unity开发之存档和读档的三种实现方式

此文内容源自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

原文地址:https://www.cnblogs.com/yoyocool/p/8527612.html

时间: 2024-07-31 15:27:22

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

【iOS开发-75】iOS数据存储的三种简单方式:plist、preference以及用NSCoding存储对象

实际开发中,存储数据主要是用SQLite.而在练习中,我们主要用如下三种存储方式. (1)利用plist存储简单地NSString.NSArray.NSDictionary等. (2)利用preference存储,和上面的类似,存储的是简单的数据,本质上还是一个plist文件. (3)利用NSCoding存储对象这些复杂的数据,本质上是一个data文件,需要被存储的类遵守NSCoding协议并实现init和encode方法. 代码如下: --在ViewController.m中 - (void)

SIKI_Unity_2_入门_通过实例学习游戏的存档和读档

SIKI_Unity_2_入门_通过实例学习游戏的存档和读档 任务5:创建设计目标 Animation的直接使用: 将Animation组件直接挂载在游戏物体上即可播放 脚本控制: 方法1: 直接在Inspector面板给Animation的Animations集合赋值动画a和b通过animation.clip = a或animation.clip = b后进行animation.Play()即可播放相关动画注意:这种情况下如果在Inspector面板的Animations集合中没有动画b,那么

数据存档和读档三种方式

using System.Collections;using System.Collections.Generic;using UnityEngine;using System.IO;using System.Runtime.Serialization.Formatters.Binary;using LitJson;using System.Xml; public class GameManager : MonoBehaviour{    public static GameManager _i

游戏的存档和读档

1.保存的数据类: 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 [System.Serializable] 6 public class Save 7 { 8 public List<int> livingTargetPosition = new List<int>(); //用来保存有怪物的位置信息 9 public List<int>

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

读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有 完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低.所以在JDK中提供了一种读写锁 ReentrantReadWriteLock,使用它可以加快运行效率. 读写锁表示两个锁,一个是读操作相关的锁,称为共享锁:另一个是写操作相关的锁,称为排他锁.我把这两个操作理解为三句话: 1.读和读之间不互斥,因为读操作不会有线程安全问题 2.

Web开发中获取Spring的ApplicationContext的三种方式

在 WEB 开发中,可能会很少需要显示的获得 ApplicationContext 来得到由 Spring 进行管理的某些 Bean, 今天我就遇到了,在这里和大家分享一下, WEB 开发中,怎么获取 ApplicationContext 一       要想怎么获取 ApplicationContext, 首先必须明白 Spring 内部 ApplicationContext 是怎样存储的.下面我们来跟踪一下源码 首先:从大家最熟悉的地方开始 Java代码   <listener> <

iOS开发基础之用三种不同方式创建Table View应用

在iOS中,有一种最常见的控件就是Table View,你也可以理解为是一个列表.在安卓中就是一个ListView.常常用在新闻客户端,邮箱,备忘录等应用上.但是在iOS实现这个列表项比Android更为简单.下面将会使用三种方法来实现一个Table View的界面. (1)模板Master-Detail Application 这是在创建一个iOS应用的时候可以选择的模板,里面已经非常好的集成了Table View控件,已经可以实现增加一项,删除一项,信息显示的功能了.我们可以在这个基础上进行

1.2 Illustrator多文档的几种排列方式

本节课将为您演示,在多个文档的情况下,文档的各种排列方式.当前窗口包含三份文档.依次点击[窗口 > 排列 > 平铺]命令. 点击[平铺]命令,将所有打开的文档,以平铺的方式紧密排列. 接着依次点击[窗口 > 排列 > 在窗口中浮动]命令. 点击[在窗口中浮动]命令,将当前的文档转换为浮动窗口. 接着依次点击[窗口 > 排列 > 全部在窗口中浮动]命令. 点击[全部在窗口中浮动]命令,将所有打开的文档转换为浮动窗口. 接着依次点击[窗口 > 排列 > 合并所有

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

最近几个月做微信开发比较多,存储微信昵称必不可少,可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了.这要怎么办呢?我来介绍几种方法 1.使用utf8mb4字符集 如果你的mysql版本>=5.5.3,你大可直接将utf8直接升级为utf8mb4字符集这