目次
はじめに
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);