この記事でのバージョン
Unity:2021.3.0f1
Dialogue System for Unity:2.2.28
Dialogue System for Unity
Active Saverとは
Active Saverとは、Saver Componentsの内の一つ。
GameObjectのアクティブ/非アクティブの状態を保存し、ロード時にその状態にするというもの。
保存/ロードはDialogueManager経由で行うことが多い。
実装方法
①DialogueManagerに「Save System」「Dialogue System Saver」「Json Data Serializer」「Auto Save Load」「Saved GameDataStorer」コンポーネントを取り付ける。
この中で「Dialogue System Saver」はDialogueSystemのデータを保存するのに必要で、厳密には「Active Saver」に関係がない。ただ、DialogueSystemのデータは保存する機会があると思うので取り付けている。
「AutoSaveLoad」はスマホアプリに便利なコンポーネントで、アプリが終了したタイミングや、裏に行った際などに自動保存され、スタート時に自動ロードされる。
保存されるものはSaver Componentsが取り付けられているものになる。
②アクティブな適当なオブジェクトに「Active Saver」コンポーネントを取り付ける。
ここで注意なのは状態を保存したいオブジェクトにではなく、他のオブジェクトにコンポーネントを取り付けること。
Keyに適当なワード、「Save Across Scene Changes」「Restore State On Start」にチェック。
そして、状態を保存したいオブジェクトを「Game Object To Watch」にアタッチする。(ここではAxeというオブジェクトの状態を保存している。)
③保存したいタイミングで保存する。
・スクリプトから保存する場合
using PixelCrushers;
...
// 保存するタイミングで呼び出す
SaveSystem.SaveSlot(_saveSlotNumber);
_saveSlotNumberは「DialogueManager」の「AutoSaveLoad」と同じNumberにする。
・スクリプト無し
「SaveSystemMethods」コンポーネントを追加し、イベント等からSaveSlotメソッドを呼び出す。
これで一通りの実装は完了。
おわりに
今回実装したのは「Active Saver」でしたが、他のSarverコンポーネントも同様に出来ると思います。
自分はシーンの切り替え時に保存して、シーン開始時にロードするように設計していたのですが、保存は成功してても、ロード出来ていないなどがあって結構手こずりました。
というのも、「Active Saver」の設定項目に「Restore State On Start」がありますが、これはデフォだとオフになっています。
説明文にも「チェックを入れなくても普通は動作する」みたいなことが書かれているのですが、これにチェックしないとシーンを何回か行き来する場合にうまくロードされないんですよね。
便利なアセットですが、日本語情報が少なくて結構困りました。(というかほぼ無い)
サポートはForum等で連絡が取れるので、分からないことがあればここで調べるか、質問してみるといいかもです。
もちろんマニュアルはあるので、そちらで調べるのが先ですが。
おわり。
コメント