はじめに
これまでは、ゲームデータの保存にPlayerPrefsを使って、リセットされても問題ない設定値やフラグを管理していました。ユーザーデータやゲームの進行データは、ScriptableObjectを経由してJSONで難読化して保存していました。
しかし、ゲームが拡張するにつれて、構造体の修正やテストに時間がかかるようになりました。「そもそも、こんなことに時間をかけたくない。自分の要件に合ったアセットはないかな?」と思っていたところ、以前購入したEasy Saveをほとんど使っていなかったことを思い出しました。Easy SaveにはPlaymakerのカスタムアクションも付いているので、自分のプロジェクトとの親和性が高そうだと思い、試してみることにしました。
使ってみた
ゲーム開始時に、ScriptableObjectにマスターデータや保存されたデータを読み込み、その値をゲームで使用します。つまり、ScriptableObjectに値が入っている状態で丸ごと保存して、次回読み込めれば良いわけです。
「ScriptableObjectを丸ごと保存する機能って、Unityの標準機能には最初から無かったっけ? Editorでの保存ならできたような気もする…」と思いながら、Easy Save 3のダイアログを操作してみました。
すると、ScriptableObjectの中身を自動で解析してくれて、保存対象を選べるようになりました。

GameObjectでも、スクリプトでも、何でも保存してくれるようです。
さらに、難読化までしてくれるとは驚きです。

難読化の効果がどの程度かは不明ですが、エミュレーターでのセーブデータ不正防止くらいにはなりそうです。
試しに、プレイヤーデータが入ったScriptableObjectを保存して、ゲーム起動時に読み込みを行うと… ちゃんとできています!
private void OnApplicationQuit()
{
// アプリ終了時にリソースを解放する
if (resourceManager != null)
{
resourceManager.ReleaseAllAssets();
}
// アプリ終了時にデータを保存する
if (scriptReference != null)
{
RefObjectsActionSupport.getRefObjectSo();
PlayerData playerDataSo = RefObjectsActionSupport.playerDataSo;
ES3.Save<PlayerData>(debugSaveKey, playerDataSo);
}
}上記のコードは、アプリ終了時にScriptableObjectのユーザーデータを丸ごと自動保存する処理です(Windows, Androidで動作確認済み)。非常に便利です。
おわりに
Easy Save 3無しではゲームが作れない体になってしまいました。
参考資料:

