前言
在游戏运行期间会产生各种不同数据。比如说获取的金币、获得的分数、角色的经验值等等。
这些数据往往时需要被记录下来的,在下一次进入游戏的时候,记录是不变的。
这些数据成为可序列化数据,在每次访问过后,需要序列化存储到本地的文件中。
重启应用时,若本地文件有更新,则反序列化文件后,更新数据库。
数据序列化与反序列化
以游戏的排行榜为例,这里简单的写了一些数据
每次游玩的得分
一些界面的设置信息:比如背景音开关
using System;
[Serializable]
public class LocalData
{
public static bool IsAgainGame = false;
private bool _isFirstGame;
private bool _isMusicOn;
private int[] _bestScoreArray;
public void SetIsFirstGame(bool isFirstGame)
{
this._isFirstGame = isFirstGame;
}
public void SetIsMusicOn(bool isMusicOn)
{
this._isMusicOn = isMusicOn;
}
public void SetBestScoreArray(int[] bestScoreArray)
{
this._bestScoreArray = bestScoreArray;
}
public bool GetIsFirstGame()
{
return this._isFirstGame ;
}
public bool GetIsMusicOn()
{
return this._isMusicOn ;
}
public int[] GetBestScoreArray()
{
return this._bestScoreArray ;
}
}
想要保存每次游玩的得分,下次点开排行榜按钮。可以看到记录。
数据的存取
/// <summary>
/// 保持数据到本地
/// </summary>
private void SaveToLocal()
{
try
{
BinaryFormatter bf = new BinaryFormatter();
//filestream
using (FileStream fs = File.Create(Application.dataPath + "/GameData.data"))
{
_localData.SetIsFirstGame(_isFirstGame);
_localData.SetBestScoreArray(_bestScoreArray);
_localData.SetIsMusicOn(_isMusicOn);
//将localData写入本地
bf.Serialize(fs,_localData);
}
}
catch (Exception exception)
{
Debug.LogError(exception.Message);
}
}
/// <summary>
/// 从本地读取
/// </summary>
private void ReadFromLocal()
{
try
{
BinaryFormatter bf = new BinaryFormatter();
//filestream
using (FileStream fs = File.Open(Application.dataPath + "/GameData.data",FileMode.Open))
{
_localData = bf.Deserialize(fs) as LocalData;
}
}
catch (Exception exception)
{
Debug.LogError(exception.Message);
}
}
保存成绩
如果新的成绩进入了前三,刷新排行榜
/// <summary>
/// 获取得分数组
/// </summary>
/// <returns></returns>
public int[] GetScoreArray()
{
List<int> scoreList = _bestScoreArray.ToList();
//从大到小排序数组
scoreList.Sort((x,y) => (-x.CompareTo(y)));
_bestScoreArray = scoreList.ToArray();
return _bestScoreArray;
}
/// <summary>
/// 保存成绩
/// </summary>
/// <param name="score"></param>
public void SaveScore(int score)
{
_bestScoreArray = GetScoreArray();
//插入成绩
int insertIndex = -1;
for (int i = 0; i < _bestScoreArray.Length; i++)
{
if (score > _bestScoreArray[i])
{
insertIndex = i;
break;
}
}
if (insertIndex == -1) return;
for (int i = _bestScoreArray.Length-1; i > insertIndex; i--)
{
_bestScoreArray[i] = _bestScoreArray[i - 1];
}
_bestScoreArray[insertIndex] = score;
SaveToLocal();
}
初始化方法和重置游戏
在GameManager调用时,调用初始化方法,判断是否从本地读取。
重置游戏:将持久化存储的数据,设置为默认值,存入本地。
/// <summary>
/// 初始化数据
/// </summary>
private void InitGameData()
{
ReadFromLocal();
if (_localData != null)
{
_isFirstGame = _localData.GetIsFirstGame();
}
else
{
_isFirstGame = true;
}
if (_isFirstGame)
{
_isMusicOn = true;
_bestScoreArray = new int[3];
SaveToLocal();
}
else
{
_isMusicOn = _localData.GetIsMusicOn();
_bestScoreArray = _localData?.GetBestScoreArray();
}
}
/// <summary>
/// 重置游戏数据
/// </summary>
public void ResetData()
{
_isMusicOn = true;
_bestScoreArray = new int[3];
SaveToLocal();
}