【Unity】簡単かつお手軽に保存(セーブ)する方法

Unity
スポンサーリンク
スポンサーリンク

標準のPrefsの問題点

Unityでデータを保存する際、お手軽に使えるのが「PlayerPrefs」や「EditorPrefs」です。

ただこの機能、intやstringなど基本的な形しか保存できません。

ちょっとしたデータを保存したいなと思った時にも、それぞれ保存処理を書かないといけなかったりちょっと面倒です。

アプローチ

データを全てJson化してstringで保存してしまいましょう。

Newtonsoft.Jsonを使うことで、様々なデータ形式を保存できるようになります。

これを応用して、Save,Load,Deleteを扱うクラスを作ることでセーブデータが扱いやすくなります!

使用例

Modelを使わないパターン

// int単体も保存可能
var intPrefs = new EditorPrefsStore<int>("任意なキー名");

// Listもそのまま保存できる
var stringListPrefs = new EditorPrefsStore<List<string>>("任意なキー名");

...

// 保存
intPrefs.Save();
stringListPrefs.Save();

// 読み込み
intPrefs.TryLoad(out var intVal);
stringListPrefs.TryLoad(out var stringList);

// 削除
intPrefs.Delete();
stringListPrefs.Delete();

Modelを使うパターン

public class SaveDataModel
{
    int xxx;
    string yyy;
}
var mySaveData = new EditorPrefsStore<SaveDataModel>("任意なキー名");

...

mySaveData.Save(); // 保存
mySaveData.TryLoad(out var saveData) // 読み込み
mySaveData.Delete(); // 削除

これでセーブデータなどを簡単に保存やロードができるようになります。

EditorPrefsStoreのコード

using UnityEditor;
using Newtonsoft.Json;

public class EditorPrefsStore<TModel>
{
	public readonly string DataKey;

	public EditorPrefsStore(string dataKey)
	{
		DataKey = dataKey;
	}

	public void Save(TModel data)
	{
		var json = JsonConvert.SerializeObject(data);
		EditorPrefs.SetString(DataKey, json);
	}

	public bool TryLoad(out TModel data)
	{
		if (EditorPrefs.HasKey(DataKey))
		{
			var json = EditorPrefs.GetString(DataKey);
			if (string.IsNullOrEmpty(json) || json == "{}" || json == "[]")
			{
				data = default;
				return false;
			}
			else
			{
				data = JsonConvert.DeserializeObject<TModel>(json);
			}

			return true;
		}
		else
		{
			data = default;
			return false;
		}
	}

	public void Delete()
	{
		EditorPrefs.DeleteKey(DataKey);
	}
}

Newtonsoft.JsonをUnityに入れる方法

PackageManagerから com.unity.nuget.newtonsoft-json を入力することで追加可能。

※Unityのバージョンによっては標準で入っていることもあります。

スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました