在幻径游戏中使用序列化和反序列化存储了一个单机的小游戏
在类前写上[System.Serializable]
GameData类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 序列化和反序列化
/// </summary>
[System.Serializable]
public class GameData
{
/// <summary>
/// 是否是重新开始游戏
/// </summary>
public static bool isAgainGame = false;
private bool isFirstGame;//第一次开始游戏
private bool isMusicOn;//当前音效是否开
private int[] bestScoreArr;//当前排名 -前三名
private int selectSkin;//当前选择皮肤
private bool[] skinUnlocked;//未解锁的皮肤
private int diamondcount;//钻石数量
public void SetIsFitstGame(bool isFirstGame)
{
this.isFirstGame = isFirstGame;
}
public void SetIsMusicOn(bool isMusicOn)
{
this.isMusicOn = isMusicOn;
}
public void SetBestScoreArr(int[] bestScoreArr)
{
this.bestScoreArr = bestScoreArr;
}
public void SetSelectSkin(int selectSkin)
{
this.selectSkin = selectSkin;
}
public void SetSkinUnlocked(bool[] skinUnlocked)
{
this.skinUnlocked = skinUnlocked;
}
public void SetDiamondcount(int diamondcount)
{
this.diamondcount = diamondcount;
}
public bool GetIsFitstGame()
{
return isFirstGame;
}
public bool GetIsMusicOn()
{
return isMusicOn;
}
public int[] GetBestScoreArr()
{
return bestScoreArr;
}
public int GetSelectSkin()
{
return selectSkin;
}
public bool[] GetSkinUnlocked()
{
return skinUnlocked;
}
public int GetDiamondcount()
{
return diamondcount;
}
}
在脚本类中调用
定义private GameData data;,拿到这个类data = new GameData();
使用序列化BinaryFormatter需要引用一下命名空间using System.Runtime.Serialization.Formatters.Binary;
创建文件的写入流
- BinaryFormatter序列化方式,就是给Book类赋值,然后进行序列化到临时存放
Application.persistentDataPath到一个新建的文件中File.Create,using可以让文件流自动释放 使用方式
FileStream fs=File.Create(Application.persistentDataPath+ "/GameData.data")
fs.close();
将流放入序列化存入数据 bf.Serialize(fs,data);
需要将GameData数据中的属性在此类设置一下,拿过来放到data
- file.OpenReal打开,反序列化解析成类,json转成类
data=(GameData)bf.Deserialize(fs); - 完整代码
/// <summary>
/// 数据存储
///
/// 文件流 引入system.IO
///
/// </summary>
private void Save()
{
try
{
BinaryFormatter bf = new BinaryFormatter();
//创建文件的写入流 自动释放fs.close
using (FileStream fs=File.Create(Application.persistentDataPath+ "/GameData.data"))
{
//拿到数据集中的字段,放到data中
data.SetBestScoreArr(bestScoreArr);
data.SetDiamondcount(diamondcount);
data.SetIsFitstGame(isFirstGame);
data.SetIsMusicOn(isMusicOn);
data.SetSelectSkin(selectSkin);
data.SetSkinUnlocked(skinUnlocked);
//写入本地
bf.Serialize(fs,data);//序列化
}
}
catch (System.Exception e)
{
Debug.Log(e.Message);
}
}
/// <summary>
/// 读取
/// </summary>
private void Read()
{
try
{
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs=File.Open(Application.persistentDataPath + "/GameData.data", FileMode.Open))
{
data=(GameData)bf.Deserialize(fs);//反序列化 返回值object
}
}
catch (System.Exception e)
{
Debug.Log(e.Message);
}
}