【Unity】Easy Save でデータをJson保存する便利シングルトンクラスを作ってみた

  • URLをコピーしました!
目次

はじめに

Unityの定番アセット『Easy Save』を利用した便利シングルトンクラスを作ってみました。

セーブデータをJsonにして保存します。

Jsonにするメリットの一つはバージョニングに強い点です。運用中のゲームでセーブデータの変数を途中から追加したり、削除したりするのも楽です。

  • 楽になること
    • 変数の削除
    • 変数の追加
    • 宣言順の変更
    • 配列のリサイズ

Unity 2021.3.27

サンプル

Easy Save3 を使ってJsonでセーブ / ロード / リセット ができます。

  • 特徴
    • どこからでも呼び出せます
    • 1つのスクリプトで完結しています
    • アプリがサスペンドした時に自動保存してくれます
    • セーブデータの保存 / 読込 / 初期化 ができます
using System;
using UnityEngine;

public class SaveModel : MonoBehaviour
{
	public static SaveModel I { get; private set; }

	void Awake()
	{
		if(I == null)
		{
			//シングルトンにする
			I = this;
			DontDestroyOnLoad(this);
		}
		else
		{
			Destroy(this);
		}
		//データロード
		LoadCall();
	}

	#region EZ3 ======================================================================

	//保存対象のデータ
	public SaveData S;

	//保存
	public void SaveCall()
	{
		//シリアライズ
		var json = JsonUtility.ToJson(this);
		//EasySave保存
		ES3.Save<string>("TEST",json);
	}
	//読込
	public void LoadCall()
	{
		//セーフティ KEYがなければスキップ
		if(!ES3.KeyExists("TEST"))return;
		//EasySave 読み込み
		var json = ES3.Load<string>("TEST");
		//デシリアライズ 上書き
		JsonUtility.FromJsonOverwrite(json,this);
	}
	//初期化
	public void ResetCall()
	{
		S = new SaveData();
		SaveCall();
	}

	#endregion EZ3 ====================================================================

	#region suspend / resume チェック ===================================================

	static bool _isBackground = false;
	void OnApplicationPause(bool pauseStatus) { ChangeBackgroundStatus(pauseStatus); }
	void OnApplicationFocus(bool hasFocus) { ChangeBackgroundStatus(!hasFocus); }

	//アプリのステータスチェック
	void ChangeBackgroundStatus(bool isBackground)
	{
		if(isBackground == _isBackground) return;
		//サスペンド レジューム処理
		if(isBackground)
		{
			//サスペンド - アプリから離脱
			//データセーブ
			SaveCall();
		}
		else
		{
			//レジューム - アプリに復帰
		}
		_isBackground = isBackground;
	}

	#endregion suspend / resume チェック =================================================
}

//保存対象のデータを定義するクラス
[Serializable]
public class SaveData
{
	public float FLT = 0;
	public int INT = 0;
	public int[] INT_ARY = new int[30];
	public string ST = "";
	public string[] ST_ARY = new string[10];
}

Tips: Jsonにするので変数名は短い方がコストも低い

使い方

下記の要領で呼び出して使います。

//値を更新する
SaveModel.I.S.FLT = 0.2f;
SaveModel.I.S.INT_ARY[0] = 8;
SaveModel.I.S.ST = "Hello!";

//保存を明示的に呼び出す場合
SaveModel.I.SaveCall();

//セーブデータを初期化する
SaveModel.I.ResetCall();

//運営中に配列を拡張したい場合、Load後にArray.ResizeをStartなどで呼び出す
Array.Resize(ref ZModel.I.S.INT_ARY,128);

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次