Unity 数据存储和读取的方法汇总
目录
- 数据场景
- PlayerPrefs
- 序列化与反序列化
- Json
- XML
在 Unity 中实现对游戏数据存储和读取的方法主要有这几种:
- 使用本地持久化类 PlayerPrefs
- 使用二进制的方法序列化和反序列化(Serialize / Deserialize)
- 使用 Json 方法
- 使用 XML 方法
数据场景
在 Demo 中分别使用这四种方法实现面板上数据的存储和读取
创建一个 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 文件
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 文件
相较于上一种方法,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 中实现数据存储和读取方法的案例内容
到此这篇关于Unity 数据存储和读取的方法的文章就介绍到这了,更多相关Unity 数据存储和读取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!