01.存档实现方式
将需要保存的数据存储在一个类中,存档时,将此类序列化为二进制数据保存在存档文件中。
02.创建存档数据类
在脚本文件夹中添加类:Archive,该类是纯数据,因需要序列化,所以要在类声明处添加[Serializable]。
03.确定需要保存的数据
- 首先是固定图层上的方块数据;
- 然后是方块类型:当前方块类型和下一个方块类型;
- 方块坐标,读档时从保存的坐标处开始下落方块;
- 当前分数和历史最高分;
关卡是可以根据分数来确定的,所以不需要保存。
下面是具体成员:
// 固定图层数据
public List<MyPoint> fixedPoints;
// 当前方块类型
public int blockType;
// 下一个方块类型
public int nextBlockType;
// 方块图层坐标
public MyPoint blockLayerPoint;
// 分数
public int score;
// 最高分
public int highScore;
在构造方法中初始化值:
public Archive()
{
fixedPoints = new List<MyPoint>();
blockType = 0;
nextBlockType = 0;
blockLayerPoint = new MyPoint(0, 0);
score = 0;
highScore = 0;
}
04.添加存档方法
在导演类中添加存档方法:
// 存档
void SaveArchive()
{
Archive archive = new Archive();
// 固定图层数据
if (_defaultLayer.ViewData.Count > 0)
{
archive.fixedPoints = new List<MyPoint>();
foreach (var item in _defaultLayer.ViewData)
{
archive.fixedPoints.Add(new MyPoint(item._line, item._list));
}
}
// 当前方块类型
// archive.blockType = 0;
// 下一个方块类型
archive.nextBlockType = (int)_nextBlockType;
// 方块图层坐标
archive.blockLayerPoint._line = _blockLayer.Point._line;
archive.blockLayerPoint._list = _blockLayer.Point._list;
// 分数
archive.score = _currentScore;
// 最高分
archive.highScore = _highScore;
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("GameSave.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, archive);
stream.Close();
}
存档方法需要引入以下命名空间:
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
在该方法中,存储当前方块类型被注释掉了,因为在导演类中缺少该值,所以需要添加一个成员并存储当前方块类型:
EBlockType _currentBlockType; // 当前方块类型
在初始化游戏和生成方块中,为当前方块类型赋值:
// 添加初始方块
_blockLayer.Point = new MyPoint(20, 4);
_currentBlockType = BlockCreator.GetInstance().RandomBlockType();
_blockLayer.ViewData = BlockCreator.GetInstance().CreateBlock(_currentBlockType);
// 使用上一次生成的类型创建方块
_currentBlockType = _nextBlockType;
_blockLayer.ViewData = BlockCreator.GetInstance().CreateBlock(_currentBlockType);
然后将存档方法中的注释删除:
// 当前方块类型
archive.blockType = (int)_currentBlockType;
// 下一个方块类型
archive.nextBlockType = (int)_nextBlockType;
05.执行存档
在执行之前,需要为MyPoint结构体也添加[Serializable],否则无法成功序列化,你需要添加System引用才能使用此特性。
存档的时机,我选择的是在游戏退出前进行存档:
// 游戏退出时调用
private void OnApplicationQuit()
{
SaveArchive();
}
06.测试
运行游戏,随便下落几个方块后,停止游戏。如果存档没有问题的话,应该会在游戏的根目录(或项目根目录)下生成“GameSave.bin”:
代码链接:https://pan.baidu.com/s/1W7zc9ycMGwmW3ipbKAvuGg
提取码:a5c6
网友评论