有了存档之后,我们就可以读取上一次游戏记录了。
01.添加读档方法
首先需要在导演类添加一个成员变量来存储读档的数据:
Archive _archive; // 存档数据
然后添加方法:
// 读档 - 将硬盘数据读取至档案
void ReadArchive()
{
// 判断是否有存档文件
if (!File.Exists("GameSave.bin")) return;
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("GameSave.bin", FileMode.OpenOrCreate, File-Access.Read, FileShare.Read);
_archive = (Archive)formatter.Deserialize(stream);
stream.Close();
}
02.何时读档
在游戏开始之前,在Start()方法中:
void Start()
{
ReadArchive();
bool initSuccess = InitGame();
// 启动定时器,执行游戏核心逻辑
if (initSuccess) InvokeRepeating("GameCore", 0, 1 - (_level - 1) * 0.1f);
}
03.恢复上一次游戏
目前只是把上一次的存档写入了档案,还需要把这些数据赋给成员变量才行。通过修改InitGame()来实现:
// 在这里恢复上一次游戏
if (_archive != null)
{
// 恢复固定图层数据
_defaultLayer.ViewData = _archive.fixedPoints;
// 恢复方块
_blockLayer.Point = _archive.blockLayerPoint;
_currentBlockType = (EBlockType)_archive.blockType;
_blockLayer.ViewData = BlockCreator.GetInstance().CreateBlock(_currentBlockType);
_nextBlockType = (EBlockType)_archive.nextBlockType;
_screenAttachedScript.GetLayer("DefaultLayer").ViewData = BlockCrea-tor.GetInstance().CreateBlock(_nextBlockType);
// 恢复分数
_currentScore = _archive.score;
_highScore = _archive.highScore;
_currentScoreScript.SetScore(_currentScore);
_highScoreScript.SetScore(_highScore);
// 暂停游戏
_paused = true;
InvokeRepeating("BlinkPauseHint", 0, 0.2f);
}
之所以在恢复游戏后暂停,是为了让你在游戏开始前做好充分准备,如果不这么做,在游戏等级高的时候,就容易手忙脚乱。
04.测试及注意点
这是正确情况下读取的存档结果:
注意,请不要消除方块时关闭游戏,目前还没有对消除进程做存档,所以如果在消除时关闭了游戏,那么下次打开后,游戏就会出错,如下所示:
要知道,分数的最后一位不可能不是0。