01.存檔實現(xiàn)方式
將需要保存的數(shù)據(jù)存儲在一個類中跪妥,存檔時姜胖,將此類序列化為二進制數(shù)據(jù)保存在存檔文件中。
02.創(chuàng)建存檔數(shù)據(jù)類
在腳本文件夾中添加類:Archive,該類是純數(shù)據(jù),因需要序列化贱鼻,所以要在類聲明處添加[Serializable]宴卖。
03.確定需要保存的數(shù)據(jù)
- 首先是固定圖層上的方塊數(shù)據(jù);
- 然后是方塊類型:當前方塊類型和下一個方塊類型邻悬;
- 方塊坐標症昏,讀檔時從保存的坐標處開始下落方塊;
- 當前分數(shù)和歷史最高分父丰;
關(guān)卡是可以根據(jù)分數(shù)來確定的肝谭,所以不需要保存。
下面是具體成員:
// 固定圖層數(shù)據(jù)
public List<MyPoint> fixedPoints;
// 當前方塊類型
public int blockType;
// 下一個方塊類型
public int nextBlockType;
// 方塊圖層坐標
public MyPoint blockLayerPoint;
// 分數(shù)
public int score;
// 最高分
public int highScore;
在構(gòu)造方法中初始化值:
public Archive()
{
fixedPoints = new List<MyPoint>();
blockType = 0;
nextBlockType = 0;
blockLayerPoint = new MyPoint(0, 0);
score = 0;
highScore = 0;
}
04.添加存檔方法
在導(dǎo)演類中添加存檔方法:
// 存檔
void SaveArchive()
{
Archive archive = new Archive();
// 固定圖層數(shù)據(jù)
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;
// 分數(shù)
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;
在該方法中础米,存儲當前方塊類型被注釋掉了分苇,因為在導(dǎo)演類中缺少該值,所以需要添加一個成員并存儲當前方塊類型:
EBlockType _currentBlockType; // 當前方塊類型
在初始化游戲和生成方塊中屁桑,為當前方塊類型賦值:
// 添加初始方塊
_blockLayer.Point = new MyPoint(20, 4);
_currentBlockType = BlockCreator.GetInstance().RandomBlockType();
_blockLayer.ViewData = BlockCreator.GetInstance().CreateBlock(_currentBlockType);
// 使用上一次生成的類型創(chuàng)建方塊
_currentBlockType = _nextBlockType;
_blockLayer.ViewData = BlockCreator.GetInstance().CreateBlock(_currentBlockType);
然后將存檔方法中的注釋刪除:
// 當前方塊類型
archive.blockType = (int)_currentBlockType;
// 下一個方塊類型
archive.nextBlockType = (int)_nextBlockType;
05.執(zhí)行存檔
在執(zhí)行之前医寿,需要為MyPoint結(jié)構(gòu)體也添加[Serializable],否則無法成功序列化蘑斧,你需要添加System引用才能使用此特性靖秩。
存檔的時機,我選擇的是在游戲退出前進行存檔:
// 游戲退出時調(diào)用
private void OnApplicationQuit()
{
SaveArchive();
}
06.測試
運行游戲竖瘾,隨便下落幾個方塊后沟突,停止游戲。如果存檔沒有問題的話捕传,應(yīng)該會在游戲的根目錄(或項目根目錄)下生成“GameSave.bin”:
代碼鏈接:https://pan.baidu.com/s/1W7zc9ycMGwmW3ipbKAvuGg
提取碼:a5c6