1. 程式人生 > 實用技巧 >Unity常見的三種資料本地持久化方案

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配置資料,可讀性良好,策劃配表方便,適合大量的資料配置需求。