运行时数据本地化

前言

在游戏运行期间会产生各种不同数据。比如说获取的金币、获得的分数、角色的经验值等等。
这些数据往往时需要被记录下来的,在下一次进入游戏的时候,记录是不变的。
这些数据成为可序列化数据,在每次访问过后,需要序列化存储到本地的文件中。
重启应用时,若本地文件有更新,则反序列化文件后,更新数据库。

数据序列化与反序列化

以游戏的排行榜为例,这里简单的写了一些数据
每次游玩的得分
一些界面的设置信息:比如背景音开关

	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();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值