Unity常見的三種資料本地持久化方案
做遊戲的時候常常會有資料配置或者存讀檔的需求,本文整理了常用的幾種解決方案,分別是Unity自帶的PlayerPrefs類,XML檔案和Json檔案。
一. PlayerPrefs
這是Unity自帶的解決方案,會自動生成檔案儲存於本地,API簡單,封裝了繁瑣的序列化反序列化過程,但他只支援幾種基本資料型別,string、int、float,比較簡單的資料存讀取功能的話,用這個會比較方便。
示例:
早前做歷史最高分數的功能,只用到了Get和Set便能實現,Get的第二個引數表示沒有取到的預設值。
//記錄分數
PlayerPrefs.SetInt("lastScore", GameUIController.Instance.score);
PlayerPrefs.SetInt("lastLength", GameUIController.Instance.bodyLength);
if (PlayerPrefs.GetInt("bestScore", 0) < GameUIController.Instance.score)
{
PlayerPrefs.SetInt("bestScore", GameUIController.Instance.score);
PlayerPrefs.SetInt("bestLength", GameUIController.Instance.bodyLength);
}
API非常簡單,Get和Set會用就掌握大半了:
二. Json(Newtonsoft)
Json的話就可以儲存複雜一點的物件,從而實現遊戲的存讀檔。提供一個Json的格式化校驗網址:連結
示例:
這裡用到的是Newtonsoft的API,需要下載ddl(官網連結),將下載的包放入Assets任意子目錄下,通過引入名稱空間using Newtonsoft.Json;
即可使用
以下為早前通過Json檔案讀取UI介面型別的簡單案例:
[
{"panelType":"MainMenu",
"path":"UIPanels/MainMenuPanel"},
{"panelType":"Battle",
"path":"UIPanels/BattlePanel"},
{"panelType":"Skill",
"path":"UIPanels/SkillPanel"},
{"panelType":"Knapsack",
"path":"UIPanels/KnapsackPanel"},
{"panelType":"Setting",
"path":"UIPanels/SettingPanel"},
{"panelType":"Task",
"path":"UIPanels/TaskPanel"}
]
/// <summary>
/// 解析UI介面Json檔案
/// </summary>
private void ParseUIPanelJson()
{
panelPathDict = new Dictionary<UIPanelType, string>();
//首先讀取Resources資料夾下的Json檔案
TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
//解析Json檔案,用這個庫的好處就是能直接反序列化成物件列表,操作簡便
List<UIPanelInfo> infoList = JsonConvert.DeserializeObject<List<UIPanelInfo>>(ta.text);
//存入字典儲存
foreach (var info in infoList)
{
panelPathDict.Add(info.panelType, info.path);
}
}
三. XML
XML一樣可以儲存複雜資料物件,相較於Json優點是可讀性良好,但效率較低,適合大量的資料配置
第一步要先寫XML模板檔案,一個怪物的配置模板示例:(必須寫兩個一樣的結點Excel才能對映)
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item ID="">
<mName></mName>
<resPath></resPath>
<hp></hp>
<ad></ad>
<ap></ap>
<addef></addef>
<apdef></apdef>
<dodge></dodge>
<pierce></pierce>
<critical></critical>
</item>
<item ID="">
<mName></mName>
<resPath></resPath>
<hp></hp>
<ad></ad>
<ap></ap>
<addef></addef>
<apdef></apdef>
<dodge></dodge>
<pierce></pierce>
<critical></critical>
</item>
</root>
第二步:
- 將模板檔案匯入Excel
- 在Excel中開啟自定義選單:檔案-選項-自定義功能區-主選項卡,將開發工具新增到主選項卡。
- 在開發工具面板裡:XML-源-XML對映-新增模版檔案
- 選中源面板裡的模版,對映到表格裡。
- 在Excel中填充資料
- 資料所有型別,最終都會轉化為字串型別
- 從Excel中匯出附帶資料的xml檔案
- 在開發工具面板裡:XML-匯出
填充資料後的Excel表格示例:
第三步:將匯出的xml檔案放入Unity專案的任意Resources資料夾下,進行解析
載入xml檔案
- 使用Unity資源系統載入檔案
TextAsset xml = Resources.Load<TextAsset>(filePath);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml.text);
- 在C#檔案IO介面載入檔案
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\Dev\info.xml");
解析xml檔案
- 獲取根節點下的所有子節點的List:
XmlNodeList nodeLst = doc.SelectSingleNode("root").ChildNodes;
- 將某一個節點轉化為一個XmlElement:
XmlElement ele = nodLst[i] as XmlElement;
- 從XmlElement裡獲取名稱為"ID"的資料:
string value = ele.GetAttributeNode("ID").InnerText;
注:資料都是以字串的形式儲存,需要自己轉化為對應的資料型別。
XML部分參考部落格:連結
四. 小結
比較簡單的資料儲存需求(如UI介面的配置)使用Unity自帶的PlayerPrefs,簡單快捷。
需要儲存複雜的資料物件,使用Json和XML,而Json較為輕量級,讀取速度較快,適合做遊戲的存檔讀檔功能,也可以做資料配置。XML較為重量級,優點是通過Excel配置資料,可讀性良好,策劃配表方便,適合大量的資料配置需求。