本地存储,序列化与反序列化
【摘要】
推荐阅读:
我的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)