使用序列化存储游戏数据,方便将对象从一个地方移动到另一个地方(转移文件再反序列化读取)使游戏数据不容易被直接篡改。
首先我们创建一个名为GameData的脚本:
using UnityEngine;
using System.Collections;
[System.Serializable]//序列化
public class GameData {
private bool isFristGame;//是否第一次运行游戏
private bool isMusicOn;//是否打开音乐
private int[] bestScoreArr;//分数记录
public void SetIsFristGame(bool isFirstGame){
this.isFristGame = isFristGame;
}
public void SetIsMusicOn(bool isMusicOn){
this.isMusicOn = isMusicOn;
}
public void SetBestScoreArr(int[] bestScoreArr){
this.bestScoreArr = bestScoreArr;
}
public bool GetIsFristGame( ){
return isFristGame;
}
public bool GetIsMusicOn( ){
return isMusicOn;
}
public int[] GetBestScoreArr( ){
return bestScoreArr;
}
}
其次我们创建一个名为GameManager的脚本来读取和修改数据:
using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;
public class GameManager : MonoBehaviour {
public static GameManager Instance;
public bool IsGameStarted{ get; set;}//记录游戏是否开始
public bool IsGameOver{ get; set;}//记录游戏是否结束
public bool IsPause{ get; set;}//记录游戏是否暂停
private GameData data;
private bool isFristGame;
private bool isMusicOn;
private int[] bestScoreArr;
private void Awake(){
Instance = this;
InitGameData ();//初始化游戏数据
}
/// <summary>
/// 初始化游戏数据
/// </summary>
private void InitGameData(){
Read ();
if (data != null) {
isFristGame = data.GetIsFristGame ();
} else {
isFristGame = true;
}
//如果第一次开始游戏
if (isFristGame) {
isFristGame = false;
isMusicOn = true;
bestScoreArr = new int[3];
data = new GameData ();//否则Save方法里会报空指针
Save ();
} else {
isMusicOn = data.GetIsMusicOn ();
bestScoreArr = data.GetBestScoreArr ();
}
}
/// <summary>
/// 储存数据
/// </summary>
private void Save(){
try {
BinaryFormatter bf=new BinaryFormatter();
using(FileStream fs=File.Create(Application.persistentDataPath+"/GameData.data")){//使用using可以自动释放流
data.SetBestScoreArr(bestScoreArr);
data.SetIsFristGame(isFristGame);
data.SetIsMusicOn(isMusicOn);
bf.Serialize(fs,data);//将类的数据序列化写进本地
}
} catch (System.Exception ex) {
Debug.Log (ex.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);//反序列化
}
} catch (System.Exception ex) {
Debug.Log (ex.Message);
}
}
/// <summary>
/// 重置数据
/// </summary>
public void ResetData(){
isFristGame = false;
isMusicOn = true;
bestScoreArr = new int[3];
Save ();
}
}
备注:修改完数据后需要调用Save()方法,不可以直接序列化unity特有的数据类型(例如Vector3, Quaternion),必须转换类型。否则会报错:“SerializationException: Type UnityEngine.XXX is not marked as Serializable.”