參考文章:
https://blog.csdn.net/a1728351227/article/details/103638106
實現游戲的存讀檔有三個方式
二進制方法
XML
JSON
對比
二進制方法:簡單,但可讀性差。
XML:可讀性強,但是文件龐大,冗余信息多。
JSON:數據格式比較簡單,易於讀寫,但是不直觀,可讀性比XML差。
二進制方法(Binary Formatter)
序列化:新建或打開一個二進制文件,通過二進制格式器將對象寫入該二進制文件。
反序列化:打開待反序列化的二進制文件,通過二進制格式器將文件解析成對象。
JSON:
是一種語言無關的發送和接收數據的常用格式。可以使用它來跨平台的傳輸數據。
JSON序列化:對象 JSON
JSON反序列化:JSON 對象
XML
擴展標記語言,用於標記電子文件使其具有結構性的標記語言。
可以用來標記數據、定義數據類型。
序列化與反序列化的方式與二進制方法十分類似。
http://blog.csdn.net/y1196645376/article/details/52541882
具體實現操作如下創建save保存類,在unity下創建c#腳本save
public class save { public List<int> livingtargetposition = new List<int>();//存活敵人位置信息 public List<int> livingmonstertype = new List<int>();//存活敵人類型信息 public int shootnum = 0;//射擊數 public int score = 0;//得分數 }12345678還需要添加一句非常重要的代碼。在類聲明之上,添加:
[System.Serializable]1這是一個屬性,它標明了代碼的一個元數據。它告訴 Unity 這個類可以被序列化,這意味着你可以將它轉換成字節流並保存到磁盤文件中。在gamemanger中我們創建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.livingTargetPositions.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; }12345678910111213141516171819202122//通過讀檔信息重置我們的游戲狀態(分數、激活狀態的怪物) private void SetGame(Save save) { //先將所有的targrt里面的怪物清空,並重置所有的計時 foreach(GameObject targetGO in targetGOs) { targetGO.GetComponent<TargetManager>().UpdateMonsters(); } //通過反序列化得到的Save對象中存儲的信息,激活指定的怪物 for(int i = 0; i < save.livingTargetPositions.Count; i++) { int position = save.livingTargetPositions[i]; int type = save.livingMonsterTypes[i]; targetGOs[position].GetComponent<TargetManager>().ActivateMonsterByType(type); }
//更新UI顯示 UIManager._instance.shootNum = save.shootNum; UIManager._instance.score = save.score; }123456789101112131415161718192021以二進制的方法保存游戲
private void SaveByBin()//保存游戲 { //序列化過程(將Save對象轉換為字節流) //創建Save對象並保存當前游戲狀態 Save save = CreateSaveGO(); //創建一個二進制格式化程序 BinaryFormatter bf = new BinaryFormatter(); //創建一個文件流 FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");//文件位置和文件名,前面都需要加/ //用二進制格式化程序的序列化方法來序列化Save對象,參數:創建的文件流和需要序列化的對象 bf.Serialize(fileStream, save); //關閉流 fileStream.Close(); }1234567891011121314讀取游戲
private void LoadByBin() { //反序列化過程 //創建一個二進制格式化程序 BinaryFormatter bf = new BinaryFormatter(); //打開一個文件流 FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile" + "/byBin.txt", FileMode.Open); //調用格式化程序的反序列化方法,將文件流轉換為一個Save對象 Save save = (Save)bf.Deserialize(fileStream); //關閉文件流 fileStream.Close(); SetGame(save); } 12345678910111213//通過讀檔信息重置我們的游戲狀態(分數、激活狀態的怪物)
private void SetGame(Save save) { //先將所有的targrt里面的怪物清空,並重置所有的計時 foreach(GameObject targetGO in targetGOs) { targetGO.GetComponent<TargetManager>().UpdateMonsters(); } //通過反序列化得到的Save對象中存儲的信息,激活指定的怪物 for(int i = 0; i < save.livingTargetPositions.Count; i++) { int position = save.livingTargetPositions[i]; int type = save.livingMonsterTypes[i]; targetGOs[position].GetComponent<TargetManager>().ActivateMonsterByType(type); } //更新UI顯示 UIManager._instance.shootNum = save.shootNum; UIManager._instance.score = save.score; }123456789101112131415161718
————————————————版權聲明:本文為CSDN博主「a1728351227」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/a1728351227/java/article/details/103638106