unity游戲中存檔和讀檔的方法


 

參考文章:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM