总所周知,一个完善的游戏是应该有着完善的存档功能的,存档的意义就是保存当时的游戏状态,在下次启动游戏时能够正常合理的打开,这样就能接着上次没有玩完的地方继续玩。
从中我们可以提取出信息:
1.保存存档时的状态(数据流)
2.读取保存的数据流并使游戏退回到存档时的状态
实现这个功能最主要在于:如何将数据保存下来以及读取。
一
在unity脚本中有PlayerPref这个类用作存储。
能够存储int,float,string类型的数据。但是也仅此类型数据,管理不太方便。
二 序列化和反序列化
有两种序列
在保存时将数据类型转换成二进制数据保留
在读取时将二进制数据翻译回数据类型,参考
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| csharp rivate void SaveByBin() { try { Date date = GetGameDate(); BinaryFormatter bf = new BinaryFormatter();//创建二进制格式化程序 using (FileStream fs = File.Create(Application.dataPath + "/SaveFiles" + "/byBin.txt")) //创建文件流 { bf.Serialize(fs, date); //将date序列化 } } catch (System.Exception e) { Debug.Log(e.Message); } } private void LoadByBin() { try { BinaryFormatter bf = new BinaryFormatter(); using (FileStream fs = File.Open(Application.dataPath + "/SaveFiles" + "/byBin.txt", FileMode.Open)) { Date date = (Date)bf.Deserialize(fs);//将date反序列化并赋值给date SetGameDate(date); } } catch (System.Exception e) { Debug.Log(e.Message); } }
|
同样可以使用json作为数据交换格式,方法类似,但是可读性和效果更好
参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| csharp private void SaveByJson() { Date date = GetGameDate(); string datapath = Application.dataPath + "/SaveFiles" + "/byJson.json"; string dateStr = JsonMapper.ToJson(date); //利用JsonMapper将date转换成字符串 StreamWriter sw = new StreamWriter(datapath); //创建一个写入流 sw.Write(dateStr);//将dateStr写入 sw.Close();//关闭流
} private void LoadByJson() { string datePath = Application.dataPath + "/SaveFiles" + "/byJson.json"; if (File.Exists(datePath )) //判断这个路径里面是否为空 { StreamReader sr = new StreamReader(datePath);//创建读取流; string jsonStr = sr.ReadToEnd();//使用方法ReadToEnd()遍历的到保存的内容 sr.Close(); Date date = JsonMapper.ToObject<Date>(jsonStr);//使用JsonMapper将遍历得到的jsonStr转换成Date对象 SetGameDate(date); } else { Debug.Log("------未找到文件------"); } }
|