【Unity】EasySave3を使ってオートセーブを実装する

はじめに

PlayerPrefsよりも使いやすいことで定評のあるEasySaveですが、使い方の記事はあまり出回っていません。

特に、オートセーブ機能に関しては日本語情報は皆無なので、覚書も兼ねて使い方をまとめました。

なお、当然ながら実装にはEasySaveが必要になるので、予め導入しておいてください。

GameObjectを保存したい場合

ES3AutoSave.csをアタッチする

ES3AutoSave.csを任意のGameObjectにアタッチするだけで、以下の情報が自動保存されます。

サポートされているコンポーネントにはTransformが含まれているので、座標を保存したい場合は上記作業だけで終了します。

Easy Save 3 Managerが必要

デフォルトでONになっているので問題ないと思いますが、EasySave及びオートセーブの挙動にはいくつかの設定が必要です。

Window > Easy Save 3… を選択

Auto Add Manager to SceneAuto Update Reference にチェック。

シーンを保存すれば、Easy Save 3 Managerが現れます。手動でコンポーネントをアタッチしてもいいですが、自動設定に任せたほうが安心です。

スポンサードサーチ

コンポーネントの変数を保存する

フィールドの保存は一手間が必要

上記のやり方だけでは、コンポーネントのフィールドが保存されません。

例えば、以下のような状況です。

Inspector上で設定したテキストを、OnGUIで表示するだけです。
シンプル極まりないですね。

このテキストをゲーム終了時に自動保存し、次回の開始時に自動的に読み込むようにするには、ES3Autosave.csだけでは上手くいきません。

同様に、敵の体力やオプションの設定項目など、変数で保持した情報を保存したい状況は多々ありますが、そのような場合は以下の手順が必要です。

ES3Typesで保存するフィールドを指定

ES3Types なるものを利用します。どのオブジェクトのどの変数を保存するかを指定できるものです。

中には保存されたくない値もあるでしょうから、保存したい変数は手動で指定する必要があるわけです。

ES3Typesの設定画面は、 Window > Easy Save 3… で表示できます。

Typesを選択し、Enter a type name in the field below に保存対象のコンポーネント名を入力します。

今回は、SaveDataObject.csの「Text」を保存したいので、SaveDataObjectを選択します。すると……

このように、フィールドが一覧で表示されます。保存したいフィールド(今回はtext)にチェックを入れ、Create ES3Type Scriptを押します。

あとは先ほどと同様に、ES3AutoSave.csをアタッチすればOKです。

上手く読み込まない際はRefreshする

上手くフィールドを読み込まない際は、ES3ReferenceManagerの「Refresh Reference」を押してください。

private変数やプロパティも表示される

Serializableされているかに関わらず、全てのフィールドが保存対象として表示されてしまう仕様のようです。

公式のドキュメントでは、プロパティの保存で望ましくない結果が現れる可能性を示しており、事前の動作確認を推奨しています。

フィールドを削除するとエラーを吐く

ES3Typesで保存対象にしたフィールドを削除すると、コンパイルエラーが発生します。

これは、 Create ES3Type Script を押した際に、専用のスクリプトが自動生成されるためです。

Easy Save 3 > Types ディレクトリにスクリプトがあります。手動で編集してもいいですが、EasySaveの機能に甘えましょう。

ES3Typesの設定画面の Reset to Default を押せば、スクリプトを再度生成し直してくれます。

まとめ

以上の手順で、任意の変数やGameObjectを自動保存できます。セーブスロット毎に分けて保存したい場合にどうすればいいかが分からないので、色々調べて判明次第、また記事を書きたいと思います。

使用したスクリプト

テキストの表示を実装するに辺り、アタッチしたスクリプトは以下です。
載せるのもバカバカしいほどシンプルです。

なお、パラメータ管理に関しては、

  • シーン間を跨ぐ
  • インスタンスは1つしか存在してはいけない

基本的に以上の要項を満たすため、 SingletonMonoBehaviourを使っています。

記事の主旨と逸れるので、SingletonMonoBehaviour に関しての具体的な説明は割愛します。詳しく知りたい方はググってください。

上記2つをプロジェクトにインポートし、SaveDataObject.csを適当なオブジェクトにアタッチしてください。

 

記事をシェアする