总所周知,一个完善的游戏是应该有着完善的存档功能的,存档的意义就是保存当时的游戏状态,在下次启动游戏时能够正常合理的打开,这样就能接着上次没有玩完的地方继续玩。

从中我们可以提取出信息:

1.保存存档时的状态(数据流)

2.读取保存的数据流并使游戏退回到存档时的状态

实现这个功能最主要在于:如何将数据保存下来以及读取。

在unity脚本中有PlayerPref这个类用作存储。img

能够存储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("------未找到文件------");
}
}