Unity 使用C#序列化和反序列化来存储游戏数据

使用序列化存储游戏数据,方便将对象从一个地方移动到另一个地方(转移文件再反序列化读取)使游戏数据不容易被直接篡改。

首先我们创建一个名为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.”

发布了3 篇原创文章 · 获赞 6 · 访问量 1321

猜你喜欢

转载自blog.csdn.net/weixin_36330051/article/details/104223495