软件编程
位置:首页>> 软件编程>> C#编程>> Unity 数据存储和读取的方法汇总

Unity 数据存储和读取的方法汇总

作者:Mr.Cat~  发布时间:2021-12-12 11:39:47 

标签:Unity,数据存储,读取

在 Unity 中实现对游戏数据存储和读取的方法主要有这几种:

  • 使用本地持久化类 PlayerPrefs

  • 使用二进制的方法序列化和反序列化(Serialize / Deserialize)

  • 使用 Json 方法

  • 使用 XML 方法

数据场景

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

Unity 数据存储和读取的方法汇总

创建一个 Data 脚本用来序列化和反序列化,需要向这个类中添加需要保存的数据,最后也是需要从这个类中读取保存的数据

需要存储和读取数据的脚本 Data

[System.Serializable]
public class Data
{
   // 关卡/生命值/关卡得分
   public int levels;
   public int health;
   public int scores;
}

向 Data 中存储和读取数据的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 数据管理
/// </summary>
public class DataManager : MonoBehaviour
{
   // 创建 Data 对象,并添加需要保存的数据
   private Data GetGameData()
   {
       Data data = new Data();
       data.levels = CanvasManager.Instance.levels;
       data.health = CanvasManager.Instance.health;
       data.scores = CanvasManager.Instance.scores;

return data;
   }

// 向游戏中加载 Data 中保存的数据
   private void SetGameData(Data data)
   {
       CanvasManager.Instance.levels = data.levels;
       CanvasManager.Instance.health = data.health;
       CanvasManager.Instance.scores = data.scores;
       CanvasManager.Instance.DataUpdate();
   }
}

PlayerPrefs

Playerprefs 是 Unity 提供的一个用于本地数据持久化保存和读取的类

原理就是利用 Key - Value 的方式将数据保存到本地(跟字典类似),然后通过代码实现数据保存、读取和更新的操作

* PlayerPrefs 只能保存 int 型、float 型和 string 型的数据,对于 bool 类型可以用 1/0 代替 真/假,实现保存的目的 *

// 数据存储:PlayerPrefs
   private void SaveByPlayerPrefs()
   {
       PlayerPrefs.SetInt("Levels", CanvasManager.Instance.levels);
       PlayerPrefs.SetInt("Health", CanvasManager.Instance.health);
       PlayerPrefs.SetInt("Scores", CanvasManager.Instance.scores);
       PlayerPrefs.Save();
   }

// 数据读取:PlayerPrefs
   private void LoadByPlayerPrefs()
   {
       if (PlayerPrefs.HasKey("Levels") && PlayerPrefs.HasKey("Health") && PlayerPrefs.HasKey("Scores"))
       {
           CanvasManager.Instance.levels = PlayerPrefs.GetInt("Levels");
           CanvasManager.Instance.health = PlayerPrefs.GetInt("Health");
           CanvasManager.Instance.scores = PlayerPrefs.GetInt("Scores");
           CanvasManager.Instance.DataUpdate();
       }
       else
           Debug.Log("- 未找到相应数据 -");
   }

通过 PlayerPrefs 中的 SetInt() 将面板上的数据通过键值对的形式进行存储;然后通过 GetInt() 去读取保存下来的值

面板上保存数据和加载数据按钮执行的方法

// 保存游戏数据
   public void SaveGameData()
   {
       SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
   }

// 加载游戏数据
   public void LoadGameData()
   {
       LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
   }

序列化与反序列化

保存的时候:

首先创建二进制格式化程序,然后创建文件流,通过格式化程序将 Data 进行序列化并保存到本地

读取的时候:

先创建二进制格式化程序,然后创建文件流,通过格式化程序将 Data 反序列化出来,然后重新设置数据

// 数据存储:二进制方法
   private void SaveByBin()
   {
       try
       {
           Data data = GetGameData();
           // 创建二进制格式化程序
           BinaryFormatter bf = new BinaryFormatter();
           using (FileStream fs = File.Create(Application.dataPath + "/SaveFiles" + "/ByBin.Txt"))
           {
               // 将 data 序列化
               bf.Serialize(fs, data);
           }
       }
       catch (System.Exception e)
       {
           Debug.Log(e.Message);
       }
   }

// 数据读取:二进制方法
   private void LoadByBin()
   {
       try
       {
           BinaryFormatter bf = new BinaryFormatter();
           using (FileStream fs = File.Open(Application.dataPath + "/SaveFiles" + "/ByBin.Txt", FileMode.Open))
           {
               // 将 data 反序列化
               Data data = (Data)bf.Deserialize(fs);
               SetGameData(data);
           }
       }
       catch (System.Exception e)
       {
           Debug.Log(e.Message);
       }
   }

* 文件流创建使用后需要及时关闭,即 fs.Close() *

在这里使用 using 指令的话就会自动关闭,省略了一步关闭的步骤

面板上保存数据和加载数据按钮执行的方法

// 保存游戏数据
   public void SaveGameData()
   {
       //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
       SaveByBin(); //通过二进制方式
   }

// 加载游戏数据
   public void LoadGameData()
   {
       //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
       LoadByBin(); //通过二进制方式读取
   }

保存成功后可以在 SaveFiles 文件夹中看到一个 ByBin.txt 文件

Unity 数据存储和读取的方法汇总

Json

json 是一种轻量级的数据交换格式,使用 Json 在 Unity 中实现数据的存储和读取是非常方便的

* 需要导入使用 Json 所需要的插件 *

// 数据存储:Json
   private void SaveByJson()
   {
       Data data = GetGameData();
       string dataPath = Application.dataPath + "/SaveFiles" + "/ByJson.json";
       // 利用 JsonMapper 将 data 转换成字符串
       string dataStr = JsonMapper.ToJson(data);
       // 创建写入流写入数据
       StreamWriter sw = new StreamWriter(dataPath);
       sw.Write(dataStr);
       // 关闭流
       sw.Close();
   }

// 数据读取:Json
   private void LoadByJson()
   {
       string dataPath = Application.dataPath + "/SaveFiles" + "/ByJson.json";
       // 判断路径文件
       if (File.Exists(dataPath))
       {
           // 创建读取流读取数据
           StreamReader sr = new StreamReader(dataPath);
           string jsonStr = sr.ReadToEnd();
           sr.Close();
           // 使用 JsonMapper 将得到的 jsonStr 转换为 data 对象
           Data data = JsonMapper.ToObject<Data>(jsonStr);
           SetGameData(data);
       }
       else
           Debug.Log("- 未找到相应文件 -");
   }

面板上保存数据和加载数据按钮执行的方法

// 保存游戏数据
   public void SaveGameData()
   {
       //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
       //SaveByBin(); //通过二进制方式存储
       SaveByJson(); // 通过 Json 方式存储
   }

// 加载游戏数据
   public void LoadGameData()
   {
       //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
       //LoadByBin(); //通过二进制方式读取
       LoadByJson(); //通过 Json 方式读取
   }

保存成功后可以在 SaveFiles 文件夹中看到一个 json 文件

Unity 数据存储和读取的方法汇总

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

XML

XML 相较于 Json 来说可读性比较好,但文件庞大,格式复杂,没有 Json 简约

// 数据存储:Xml
   private void SaveByXml()
   {
       Data data = GetGameDate();
       string dataPath = Application.dataPath + "/SaveFiles" + "/ByXml.txt";
       // 创建 Xml 文档
       XmlDocument xmlDoc = new XmlDocument();
       // 创建根节点并设置名称
       XmlElement root = xmlDoc.CreateElement("SaveByXml");
       root.SetAttribute("name", "savefile");
       // 创建其他节点并设置值
       XmlElement levels = xmlDoc.CreateElement("levels");
       levels.InnerText = data.levels.ToString();
       XmlElement health = xmlDoc.CreateElement("health");
       health.InnerText = data.health.ToString();
       XmlElement scores = xmlDoc.CreateElement("scores");
       scores.InnerText = data.scores.ToString();
       // 将子节点加入根节点,并将根节点加入 Xml 文档
       root.AppendChild(levels);
       root.AppendChild(health);
       root.AppendChild(scores);
       xmlDoc.AppendChild(root);
       xmlDoc.Save(dataPath);
   }

// 数据读取:Xml
   private void LoadByXml()
   {
       string dataPath = Application.dataPath + "/SaveFiles" + "/ByXml.txt";
       if (File.Exists(dataPath))
       {
           Data data = new Data();
           XmlDocument xmlDoc = new XmlDocument();
           // 加载指定路径的 Xml 文档
           xmlDoc.Load(dataPath);
           // 通过名字得到相对应的值
           XmlNodeList levels = xmlDoc.GetElementsByTagName("levels");
           data.levels = int.Parse(levels[0].InnerText);
           XmlNodeList health = xmlDoc.GetElementsByTagName("health");
           data.health = int.Parse(health[0].InnerText);
           XmlNodeList scores = xmlDoc.GetElementsByTagName("scores");
           data.scores = int.Parse(scores[0].InnerText);
           SetGameDate(data);
       }
       else
           Debug.Log("- 未找到相应文件 -");
   }

面板上保存数据和加载数据按钮执行的方法

// 保存游戏数据
   public void SaveGameData()
   {
       //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
       //SaveByBin(); //通过二进制方式存储
       //SaveByJson(); //通过 Json 方式存储
       SaveByXml(); //通过 Xml 方式存储
   }

// 加载游戏数据
   public void LoadGameData()
   {
       //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
       //LoadByBin(); //通过二进制方式读取
       //LoadByJson(); //通过 Json 方式读取
       LoadByXml(); //通过 Xml 方式读取
   }

保存成功后可以在 SaveFiles 文件夹中看到一个 txt 文件

Unity 数据存储和读取的方法汇总

来源:https://www.cnblogs.com/Haha1999/p/16803479.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com