本地存储,序列化与反序列化

举报
爱上游戏开发 发表于 2022/07/01 23:51:26 2022/07/01
【摘要】 推荐阅读:  我的CSDN 我的博客园 QQ群:704621321       在没...

推荐阅读:

      在没有服务器的情况下,有时候我们希望游戏数据进度能保存下来,这是就需要使用本地存储技术了,今天我们就来聊怎么实现游戏数据本地缓存吧。

      本地存储,把需要缓存的数据存储为一个文件,存储文件时需要将它序列化;当需要缓存数据时就读取该文件,将其反序列化得到需要的数据。

下面通过实例具体介绍一下实现方法

(1)定义一个游戏数据类为GameData,用序列化存储需要在类前写上 [System.Serializable]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class GameData
{
	...
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(2)定义游戏中需要保存的数据

    private bool isFirstGame;//是否是第一次游戏(必要变量)
    private bool isMusicOn;
    private int[] bestScoreArr;//保存前三名
    private int diamondCount;//砖石数量

  
 
  • 1
  • 2
  • 3
  • 4

(3)定义设置(2)中变量的方法

    public void SetIsFirstGame(bool isFirstGame)
    {
        this.isFirstGame = isFirstGame;
    }
    public void SetIsMusicOn(bool isMusicOn)
    {
        this.isMusicOn = isMusicOn;
    }
    public void SetBestScoreArr(int[] bestScoreArr)
    {
        this.bestScoreArr = bestScoreArr;
    }
    public void SetDiamondCount(int diamondCount)
    {
        this.diamondCount = diamondCount;
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(4)定义获取(2)中变量的方法

    public bool GetIsFirstGame()
    {
        return this.isFirstGame;
    }
    public bool GetisMusicOn()
    {
        return this.isMusicOn;
    }
    public int[] GetBestScoreArr()
    {
        return this.bestScoreArr;
    }
    public int GetDiamondCount()
    {
        return this.diamondCount;
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(5)在初始化游戏的地方定义保存数据,读取数据的方法,这里选用在GameMananger脚本

    private void Save()
    {
        try
        {
        	//需要引入命名空间using
            BinaryFormatter bf = new BinaryFormatter(); System.Runtime.Serialization.Formatters.Binary;
            //需要引入命名空间using System.IO;
            using (FileStream fs = File.Create(Application.persistentDataPath + "/GameData.data"))//文件保存的名字和路径
            {
                data.SetBestScoreArr(bestScoreArr);
                data.SetDiamondCount(diamondCount);
                data.SetIsFirstGame(isFirstGame);
                data.SetIsMusicOn(isMusicOn);

                bf.Serialize(fs,data);//序列化
            }
        }
        catch (System.Exception e)
        {

            Debug.Log(e.Message);
        }
    }


    private void Read()
    {
        try
        {
            BinaryFormatter bf = new BinaryFormatter();
            using (FileStream fs = File.Open(Application.persistentDataPath + "/GameData.data", FileMode.Open))
            {
                data = (GameData)bf.Deserialize(fs);//反序列化,并强制转换类型
            }
        }
        catch (System.Exception e)
        {

            Debug.Log(e.Message);
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

(6)在GameMananger中定义一个方法来初始化游戏数据,命名为InitGameData。先读数据,如果数据为空,则是首次进入,首次进入需要初始化数据并保存;非空则不是首次进入,则直接取数据。

    private void InitGameData()
    {
        Read();
        if (data != null)
        {
        	//不是首次游戏
            isFirstGame = data.GetIsFirstGame();
        }
        else
        {
        //首次游戏
            isFirstGame = true;
        }

        if (isFirstGame)
        {
        	//初始化数据
            isMusicOn = true;
            bestScoreArr = new int[3];
            diamondCount = 0;
            Save();//初始化完需要保存数据
        }
        else
        {
        	//读取缓存数据
            isMusicOn = data.GetisMusicOn();
            bestScoreArr = data.GetBestScoreArr();
            diamondCount = data.GetDiamondCount();
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

(7)在Awake中调用InitGameData()方法

文章来源: unity3d.blog.csdn.net,作者:爱上游戏开发,版权归原作者所有,如需转载,请联系作者。

原文链接:unity3d.blog.csdn.net/article/details/87913009

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。