unity教程:存檔系統(tǒng)(XML篇)

using UnityEngine;
using TMPro;
using System.IO;
using System.Xml;
public class xml_ArchiveManager : MonoBehaviour
{
//需要保存與加載的數(shù)據(jù)
public Data data = new Data();
//需要保存與讀取的游戲內(nèi)數(shù)據(jù)
public TMP_InputField text1;
public TMP_InputField text2;
public TMP_InputField text3;
public TMP_InputField text4;
//定義游戲保存數(shù)據(jù)路徑
public static string savaGameDataPath;
private void Awake()
{
//PS:Application.persistentDataPath獲得的是unity游戲數(shù)據(jù)文件夾的路徑
savaGameDataPath = Application.persistentDataPath;
//debug打印保存數(shù)據(jù)的路徑
Debug.Log(savaGameDataPath);
}
/// <summary>
/// 更新數(shù)據(jù) (將游戲內(nèi)數(shù)據(jù)保存以方便保存到本地)
/// </summary>
private void UpdateData()
{
data.data1 = text1.text;
data.data2 = text2.text;
data.data3 = text3.text;
data.data4 = text4.text;
}
/// <summary>
/// 更新游戲 (將數(shù)據(jù)保存到游戲中以方便游戲進行數(shù)據(jù)操作)
/// </summary>
private void UpdateGame()
{
text1.text = data.data1;
text2.text = data.data2;
text3.text = data.data3;
text4.text = data.data4;
}
/// <summary>
/// 保存游戲數(shù)據(jù)至本地
/// </summary>
public void SavaData()
{
//更新數(shù)據(jù) 方便后續(xù)保存數(shù)據(jù)至本地
UpdateData();
//檢測是否存在該文件夾
if (!Directory.Exists(savaGameDataPath + "/game_Data_xml"))
{
//如果沒有該文件夾則在該路徑下創(chuàng)建一個名為game_Data的文件夾
Directory.CreateDirectory(savaGameDataPath + "/game_Data_xml");
}
//實例化XmlDocument文檔以便調(diào)用XmlDocument實例方法
XmlDocument xml = new XmlDocument();
//使用XmlDocument實例方法CreateElement創(chuàng)建一個節(jié)點
XmlElement chen = xml.CreateElement("Chen");
//使用XmlElement實例方法SetAttribute設(shè)置節(jié)點屬性
chen.SetAttribute("Name", "主節(jié)點");
//使用XmlDocument實例方法CreateElement創(chuàng)建一個節(jié)點 (存檔ID節(jié)點)
XmlElement id = xml.CreateElement("ArchiveID");
//使用XmlElement實例方法SetAttribute設(shè)置節(jié)點屬性 (設(shè)置存檔ID)
id.SetAttribute("ID", "1");
//將存檔ID節(jié)點添加至主節(jié)點中 成為其子節(jié)點
chen.AppendChild(id);
#region 保存數(shù)據(jù)部分
//使用XmlDocument實例方法CreateElement創(chuàng)建一個節(jié)點 (數(shù)據(jù)節(jié)點)
XmlElement data1 = xml.CreateElement("data1");
//將數(shù)據(jù)節(jié)點添加至存檔ID節(jié)點中 成為其子節(jié)點
id.AppendChild(data1);
//通過XmlElement的InnerText屬性設(shè)置節(jié)點信息 (數(shù)據(jù)內(nèi)容)
data1.InnerText = text1.text;
//使用XmlDocument實例方法CreateElement創(chuàng)建一個節(jié)點 (數(shù)據(jù)節(jié)點)
XmlElement data2 = xml.CreateElement("data2");
//將數(shù)據(jù)節(jié)點添加至存檔ID節(jié)點中 成為其子節(jié)點
id.AppendChild(data2);
//通過XmlElement的InnerText屬性設(shè)置節(jié)點信息 (數(shù)據(jù)內(nèi)容)
data2.InnerText = text2.text;
//使用XmlDocument實例方法CreateElement創(chuàng)建一個節(jié)點 (數(shù)據(jù)節(jié)點)
XmlElement data3 = xml.CreateElement("data3");
//將數(shù)據(jù)節(jié)點添加至存檔ID節(jié)點中 成為其子節(jié)點
id.AppendChild(data3);
//通過XmlElement的InnerText屬性設(shè)置節(jié)點信息 (數(shù)據(jù)內(nèi)容)
data3.InnerText = text3.text;
//使用XmlDocument實例方法CreateElement創(chuàng)建一個節(jié)點 (數(shù)據(jù)節(jié)點)
XmlElement data4 = xml.CreateElement("data4");
//將數(shù)據(jù)節(jié)點添加至存檔ID節(jié)點中 成為其子節(jié)點
id.AppendChild(data4);
//通過XmlElement的InnerText屬性設(shè)置節(jié)點信息 (數(shù)據(jù)內(nèi)容)
data4.InnerText = text4.text;
#endregion
//將主節(jié)點添加至XmlDocument文檔中
xml.AppendChild(chen);
//將XmlDocument文檔內(nèi)容保存到路徑所在文件中
xml.Save(savaGameDataPath + "/game_Data_xml/" + "data.xml");
}
/// <summary>
/// 讀取本地數(shù)據(jù)至游戲
/// </summary>
public void LoadData()
{
//檢測是否存在該文件
if (File.Exists(savaGameDataPath + "/game_Data_xml/data.xml"))
{
//使用File靜態(tài)方法Open讀取保存在本地的數(shù)據(jù)文件
using (FileStream file = File.Open(savaGameDataPath + "/game_Data_xml/data.xml", FileMode.Open))
{
//實例化XmlDocument文檔以便調(diào)用XmlDocument實例方法
XmlDocument xml = new XmlDocument();
//使用XmlDocument實例方法Load加載xml文件內(nèi)容
xml.Load(file);
XmlNodeList xmlNodeList = xml.GetElementsByTagName("ArchiveID");
//需要讀取的存檔的ID值
string ID = "1";
//讀取所有存檔信息
foreach (XmlNode item in xmlNodeList)
{
//判斷是否是需要的存檔
if(ID == item.Attributes[0].Value)
{
//將對應(yīng)存檔ID節(jié)點下的子節(jié)點信息保存下來
data.data1 = item.ChildNodes[0].InnerText;
data.data2 = item.ChildNodes[1].InnerText;
data.data3 = item.ChildNodes[2].InnerText;
data.data4 = item.ChildNodes[3].InnerText;
}
}
}
//更新游戲 把本地數(shù)據(jù)更新到游戲中
UpdateGame();
}
}
}