標準の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のバージョンによっては標準で入っていることもあります。