網站首頁 編程語言 正文
在 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 中實現數據存儲和讀取方法的案例內容
原文鏈接:https://www.cnblogs.com/Haha1999/p/16803479.html
相關推薦
- 2022-05-08 react實現導航欄二級聯動_React
- 2022-11-18 Redis?存儲對象信息用?Hash?和String的區別_Redis
- 2022-05-25 創建指定大小文件,怎么創建?
- 2022-11-22 python正則表達式中匹配次數與貪心問題詳解(+??*)_python
- 2022-06-24 使用python?matplotlib畫折線圖實例代碼_python
- 2022-04-01 SQL?Server?數據庫基礎編程詳解_MsSql
- 2022-09-16 Oracle查看表空間使用率以及爆滿解決方案詳解_oracle
- 2022-12-12 React?中state與props更新深入解析_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支