天天看點

Unity資料的持久化儲存 ☞ Xml方式儲存

要儲存的資料

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]//可序列化特性
public class Save
{
	public List<int> livingTagetPositions = new List<int>();
	public List<int> livingMonsterTypes = new List<int>();

	public int shootNum = 0;
	public int score = 0;
}
           

資料的儲存與讀取

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

public class GameManager : MonoBehaviour
{
//建立Save對象并存儲目前遊戲狀态資訊
	private Save CreateSaveGo()
	{
		//建立Save對象
		Save save = new Save();
		//周遊目前所有target
		//如果其中有處于存活狀态的怪物
		//就把該target的位置資訊,激活狀态的怪物類型添加到List中
		foreach (GameObject targetGo in targetGOs)
		{
			TargetManager targetManager = targetGo.GetComponent<TargetManager>();
			if (targetManager.activeMonster != null)
			{
				save.livingTagetPositions.Add(targetManager.targetPosition);
				int type = targetManager.activeMonster.GetComponent<MonsterManager>().monsterType;
				save.livingMonsterTypes.Add(type);
			}
		}
		//把shootNum和score儲存在Save對象中
		save.shootNum = UIManager._instance.shootNum;
		save.score = UIManager._instance.score;
		//傳回該Save對象
		return save;
	}

//通過讀檔資訊,重置遊戲狀态(分數、激活狀态的怪物)
	private void SetGame(Save save)
	{
		//先将所有的target裡面的怪物情況,并重置所有的計時
		foreach (GameObject targetGO in targetGOs)
		{
			targetGO.GetComponent<TargetManager>().UpdateMonsters();
		}
		//通過反序列化得到的Save對象中存儲的資訊,激活指定的怪物
		for (int i = 0; i < save.livingTagetPositions.Count; i++)
		{
			int position = save.livingTagetPositions[i];
			int type = save.livingMonsterTypes[i];
			targetGOs[position].GetComponent<TargetManager>().ActiveMonsterByType(type);
		}
		//更新UI顯示
		UIManager._instance.shootNum = save.shootNum;
		UIManager._instance.score = save.score;
		//調整未暫停狀态
		UnPause();
	}
	
//Xml:存檔和讀檔
	private void SaveByXml()
	{
		Save save = CreateSaveGo();
		//建立Xml檔案的存儲路徑
		string filePath = Application.dataPath + "/StreamingFile" + "/byXml.txt";
		//建立Xml文檔
		XmlDocument xmlDoc = new XmlDocument();
		//建立根節點,即最上層節點
		XmlElement root = xmlDoc.CreateElement("save");
		//設定根節點中的值
		root.SetAttribute("name", "SaveFile1");

		//建立XMLElement
		XmlElement target;
		XmlElement targetPosition;
		XmlElement monsterType;

		//周遊save中存儲的資料,将資料轉化成XML格式
		for (int i = 0; i < save.livingTagetPositions.Count; i++)
		{
			//外層
			target = xmlDoc.CreateElement("target");
			//内層
			targetPosition = xmlDoc.CreateElement("targetPosition");
			//設定InnerText值
			targetPosition.InnerText = save.livingTagetPositions[i].ToString();
			monsterType = xmlDoc.CreateElement("monsterType");
			monsterType.InnerText = save.livingMonsterTypes[i].ToString();

			//設定節點間的層級關系 root -- target (targetPosition, monsterType)
			target.AppendChild(targetPosition);
			target.AppendChild(monsterType);
			root.AppendChild(target);
		}

		//設定射擊數和分數節點并設定層級關系   xmlDoc -- root -- (target (targetPosition, monsterType), shootNum, score )
		XmlElement shootNum = xmlDoc.CreateElement("shootNum");
		shootNum.InnerText = save.shootNum.ToString();
		root.AppendChild(shootNum);

		XmlElement score = xmlDoc.CreateElement("score");
		score.InnerText = save.score.ToString();
		root.AppendChild(score);

		xmlDoc.AppendChild(root);
		xmlDoc.Save(filePath);

		if (File.Exists(Application.dataPath + "/StreamingFile" + "/byXml.txt"))
		{
			UIManager._instance.ShowMessage("儲存成功!");
		}
	}
//Xml:存檔和讀檔
	private void LoadByXml()
	{
		string filePath = Application.dataPath + "/StreamingFile" + "/byXml.txt";
		if (File.Exists(filePath))
		{
			Save save = new Save();
			//加載xml文檔
			XmlDocument xmlDoc = new XmlDocument();
			xmlDoc.Load(filePath);

			//通過節點名稱來擷取元素,結果為XmlNodeList類型
			XmlNodeList targets = xmlDoc.GetElementsByTagName("target");
			//周遊所有的target節點,并獲得子節點和子節點的InnerText
			if (targets.Count != 0)
			{
				foreach (XmlNode target in targets)
				{
					XmlNode targetPosition = target.ChildNodes[0];
					int targetPositionIndex = int.Parse(targetPosition.InnerText);
					//把得到的值存儲到save中
					save.livingTagetPositions.Add(targetPositionIndex);

					XmlNode monsterType = target.ChildNodes[1];
					int monsterTypeIndex = int.Parse(monsterType.InnerText);
					save.livingMonsterTypes.Add(monsterTypeIndex);
				}
			}

			//得到存儲的射擊數和分數
			XmlNodeList shootNum = xmlDoc.GetElementsByTagName("shootNum");
			int shootNumCount = int.Parse(shootNum[0].InnerText);
			save.shootNum = shootNumCount;

			XmlNodeList score = xmlDoc.GetElementsByTagName("score");
			int scoreCount = int.Parse(score[0].InnerText);
			save.score = scoreCount;

			SetGame(save);
			UIManager._instance.ShowMessage("");
		}
		else
		{
			UIManager._instance.ShowMessage("存檔檔案不存在");
		}
	}
}
           

儲存生成的Xml文檔

Unity資料的持久化儲存 ☞ Xml方式儲存