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