[C.C++] Unity数据存储和读取的方法汇总

1993 0
王子 2022-11-5 08:05:47 | 显示全部楼层 |阅读模式
目录

    数据场景PlayerPrefs序列化与反序列化JsonXML

在 Unity 中实现对游戏数据存储和读取的方法主要有这几种:
    使用本地持久化类 PlayerPrefs使用二进制的方法序列化和反序列化(Serialize / Deserialize)使用 Json 方法使用 XML 方法

数据场景

在 Demo 中分别使用这四种方法实现面板上数据的存储和读取


创建一个 Data 脚本用来序列化和反序列化,需要向这个类中添加需要保存的数据,最后也是需要从这个类中读取保存的数据
需要存储和读取数据的脚本 Data
  1. [System.Serializable]
  2. public class Data
  3. {
  4.     // 关卡/生命值/关卡得分
  5.     public int levels;
  6.     public int health;
  7.     public int scores;
  8. }
复制代码
向 Data 中存储和读取数据的方法
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// 数据管理
  6. /// </summary>
  7. public class DataManager : MonoBehaviour
  8. {
  9.     // 创建 ata 对象,并添加需要保存的数据
  10.     private Data GetGameData()
  11.     {
  12.         Data data = new Data();
  13.         data.levels = CanvasManager.Instance.levels;
  14.         data.health = CanvasManager.Instance.health;
  15.         data.scores = CanvasManager.Instance.scores;
  16.         return data;
  17.     }
  18.     // 向游戏中加载 Data 中保存的数据
  19.     private void SetGameData(Data data)
  20.     {
  21.         CanvasManager.Instance.levels = data.levels;
  22.         CanvasManager.Instance.health = data.health;
  23.         CanvasManager.Instance.scores = data.scores;
  24.         CanvasManager.Instance.DataUpdate();
  25.     }
  26. }
复制代码
PlayerPrefs

Playerprefs 是 Unity 提供的一个用于本地数据持久化保存和读取的类
原理就是利用 Key - Value 的方式将数据保存到本地(跟字典类似),然后通过代码实现数据保存、读取和更新的操作
* PlayerPrefs 只能保存 int 型、float 型和 string 型的数据,对于 bool 类型可以用 1/0 代替 真/假,实现保存的目的 *
  1. // 数据存储:PlayerPrefs
  2.     private void SaveByPlayerPrefs()
  3.     {
  4.         PlayerPrefs.SetInt("Levels", CanvasManager.Instance.levels);
  5.         PlayerPrefs.SetInt("Health", CanvasManager.Instance.health);
  6.         PlayerPrefs.SetInt("Scores", CanvasManager.Instance.scores);
  7.         PlayerPrefs.Save();
  8.     }
  9.     // 数据读取:PlayerPrefs
  10.     private void LoadByPlayerPrefs()
  11.     {
  12.         if (PlayerPrefs.HasKey("Levels") && PlayerPrefs.HasKey("Health") && PlayerPrefs.HasKey("Scores"))
  13.         {
  14.             CanvasManager.Instance.levels = PlayerPrefs.GetInt("Levels");
  15.             CanvasManager.Instance.health = PlayerPrefs.GetInt("Health");
  16.             CanvasManager.Instance.scores = PlayerPrefs.GetInt("Scores");
  17.             CanvasManager.Instance.DataUpdate();
  18.         }
  19.         else
  20.             Debug.Log("- 未找到相应数据 -");
  21.     }
复制代码
通过 PlayerPrefs 中的 SetInt() 将面板上的数据通过键值对的形式进行存储;然后通过 GetInt() 去读取保存下来的值
面板上保存数据和加载数据按钮执行的方法
  1. // 保存游戏数据
  2.     public void SaveGameData()
  3.     {
  4.         SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
  5.     }
  6.     // 加载游戏数据
  7.     public void LoadGameData()
  8.     {
  9.         LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
  10.     }
复制代码
序列化与反序列化

保存的时候:
首先创建二进制格式化程序,然后创建文件流,通过格式化程序将 Data 进行序列化并保存到本地
读取的时候:
先创建二进制格式化程序,然后创建文件流,通过格式化程序将 Data 反序列化出来,然后重新设置数据
  1. // 数据存储:二进制方法
  2.     private void SaveByBin()
  3.     {
  4.         try
  5.         {
  6.             Data data = GetGameData();
  7.             // 创建二进制格式化程序
  8.             BinaryFormatter bf = new BinaryFormatter();
  9.             using (FileStream fs = File.Create(Application.dataPath + "/SaveFiles" + "/ByBin.Txt"))
  10.             {
  11.                 // 将 data 序列化
  12.                 bf.Serialize(fs, data);
  13.             }
  14.         }
  15.         catch (System.Exception e)
  16.         {
  17.             Debug.Log(e.Message);
  18.         }
  19.     }
  20.     // 数据读取:二进制方法
  21.     private void LoadByBin()
  22.     {
  23.         try
  24.         {
  25.             BinaryFormatter bf = new BinaryFormatter();
  26.             using (FileStream fs = File.Open(Application.dataPath + "/SaveFiles" + "/ByBin.Txt", FileMode.Open))
  27.             {
  28.                 // 将 data 反序列化
  29.                 Data data = (Data)bf.Deserialize(fs);
  30.                 SetGameData(data);
  31.             }
  32.         }
  33.         catch (System.Exception e)
  34.         {
  35.             Debug.Log(e.Message);
  36.         }
  37.     }
复制代码
* 文件流创建使用后需要及时关闭,即 fs.Close() *
在这里使用 using 指令的话就会自动关闭,省略了一步关闭的步骤
面板上保存数据和加载数据按钮执行的方法
  1. // 保存游戏数据
  2.     public void SaveGameData()
  3.     {
  4.         //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
  5.         SaveByBin(); //通过二进制方式
  6.     }
  7.     // 加载游戏数据
  8.     public void LoadGameData()
  9.     {
  10.         //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
  11.         LoadByBin(); //通过二进制方式读取
  12.     }
复制代码
保存成功后可以在 SaveFiles 文件夹中看到一个 ByBin.txt 文件



Json

json 是一种轻量级的数据交换格式,使用 Json 在 Unity 中实现数据的存储和读取是非常方便的
* 需要导入使用 Json 所需要的插件 *
  1. // 数据存储:Json
  2.     private void SaveByJson()
  3.     {
  4.         Data data = GetGameData();
  5.         string dataPath = Application.dataPath + "/SaveFiles" + "/ByJson.json";
  6.         // 利用 JsonMapper 将 data 转换成字符串
  7.         string dataStr = JsonMapper.ToJson(data);
  8.         // 创建写入流写入数据
  9.         StreamWriter sw = new StreamWriter(dataPath);
  10.         sw.Write(dataStr);
  11.         // 关闭流
  12.         sw.Close();
  13.     }
  14.     // 数据读取:Json
  15.     private void LoadByJson()
  16.     {
  17.         string dataPath = Application.dataPath + "/SaveFiles" + "/ByJson.json";
  18.         // 判断路径文件
  19.         if (File.Exists(dataPath))
  20.         {
  21.             // 创建读取流读取数据
  22.             StreamReader sr = new StreamReader(dataPath);
  23.             string jsonStr = sr.ReadToEnd();
  24.             sr.Close();
  25.             // 使用 JsonMapper 将得到的 jsonStr 转换为 data 对象
  26.             Data data = JsonMapper.ToObject<Data>(jsonStr);
  27.             SetGameData(data);
  28.         }
  29.         else
  30.             Debug.Log("- 未找到相应文件 -");
  31.     }
复制代码
面板上保存数据和加载数据按钮执行的方法
  1. // 保存游戏数据
  2.     public void SaveGameData()
  3.     {
  4.         //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
  5.         //SaveByBin(); //通过二进制方式存储
  6.         SaveByJson(); // 通过 Json 方式存储
  7.     }
  8.     // 加载游戏数据
  9.     public void LoadGameData()
  10.     {
  11.         //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
  12.         //LoadByBin(); //通过二进制方式读取
  13.         LoadByJson(); //通过 Json 方式读取
  14.     }
复制代码
保存成功后可以在 SaveFiles 文件夹中看到一个 json 文件


相较于上一种方法,Json 数据的可读性要好很多

XML

XML 相较于 Json 来说可读性比较好,但文件庞大,格式复杂,没有 Json 简约
  1. // 数据存储:Xml
  2.     private void SaveByXml()
  3.     {
  4.         Data data = GetGameDate();
  5.         string dataPath = Application.dataPath + "/SaveFiles" + "/ByXml.txt";
  6.         // 创建 Xml 文档
  7.         XmlDocument xmlDoc = new XmlDocument();
  8.         // 创建根节点并设置名称
  9.         XmlElement root = xmlDoc.CreateElement("SaveByXml");
  10.         root.SetAttribute("name", "savefile");
  11.         // 创建其他节点并设置值
  12.         XmlElement levels = xmlDoc.CreateElement("levels");
  13.         levels.InnerText = data.levels.ToString();
  14.         XmlElement health = xmlDoc.CreateElement("health");
  15.         health.InnerText = data.health.ToString();
  16.         XmlElement scores = xmlDoc.CreateElement("scores");
  17.         scores.InnerText = data.scores.ToString();
  18.         // 将子节点加入根节点,并将根节点加入 Xml 文档
  19.         root.AppendChild(levels);
  20.         root.AppendChild(health);
  21.         root.AppendChild(scores);
  22.         xmlDoc.AppendChild(root);
  23.         xmlDoc.Save(dataPath);
  24.     }
  25.     // 数据读取:Xml
  26.     private void LoadByXml()
  27.     {
  28.         string dataPath = Application.dataPath + "/SaveFiles" + "/ByXml.txt";
  29.         if (File.Exists(dataPath))
  30.         {
  31.             Data data = new Data();
  32.             XmlDocument xmlDoc = new XmlDocument();
  33.             // 加载指定路径的 Xml 文档
  34.             xmlDoc.Load(dataPath);
  35.             // 通过名字得到相对应的值
  36.             XmlNodeList levels = xmlDoc.GetElementsByTagName("levels");
  37.             data.levels = int.Parse(levels[0].InnerText);
  38.             XmlNodeList health = xmlDoc.GetElementsByTagName("health");
  39.             data.health = int.Parse(health[0].InnerText);
  40.             XmlNodeList scores = xmlDoc.GetElementsByTagName("scores");
  41.             data.scores = int.Parse(scores[0].InnerText);
  42.             SetGameDate(data);
  43.         }
  44.         else
  45.             Debug.Log("- 未找到相应文件 -");
  46.     }
复制代码
面板上保存数据和加载数据按钮执行的方法
  1. // 保存游戏数据
  2.     public void SaveGameData()
  3.     {
  4.         //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
  5.         //SaveByBin(); //通过二进制方式存储
  6.         //SaveByJson(); //通过 Json 方式存储
  7.         SaveByXml(); //通过 Xml 方式存储
  8.     }
  9.     // 加载游戏数据
  10.     public void LoadGameData()
  11.     {
  12.         //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
  13.         //LoadByBin(); //通过二进制方式读取
  14.         //LoadByJson(); //通过 Json 方式读取
  15.         LoadByXml(); //通过 Xml 方式读取
  16.     }
复制代码
保存成功后可以在 SaveFiles 文件夹中看到一个 txt 文件


以上就是使用这四种方法在 Unity 中实现数据存储和读取方法的案例内容
到此这篇关于Unity 数据存储和读取的方法的文章就介绍到这了,更多相关Unity 数据存储和读取内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行