要儲存的資料
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文檔