【Unity】Fungusでゲーム制作(6) セーブ・ロードを実装する

Fungusの基本的な使い方に関しては[第1回](https://qiita.com/Kirikabu_ueda/items/bfc6e086d408b1cba34b)の記事で解説しておりますので、まだの方はそちらからお読み下さい。

[前回](https://qiita.com/Kirikabu_ueda/items/a748c22e1f645f4b448d)はアイテム欄を作る所まででした。
さて長めのゲームを作るとなったらセーブやロードの機能も必要です。ここではFungusでセーブ・ロード機能をどう実装するかについて解説します。

# Save Menuを作る
Fungusにはなんとセーブ・ロードメニュー用のUIが初めから入っています。Fungusのメニューから**「Create」→「Save Menu」**を選ぶとこんな感じで出てくるかと思います。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/8328eb86-374f-e74f-d017-d57475fa867e.png)
この状態ですでに動くので、ゲームを起動してみましょう。右上の三本棒が並んだボタンを押すとセーブ・ロードのメニューが出てきます。簡単なバックログもついてきてますし、Restartボタンを押せばゲームを最初からやり直すこともできます。しかしセーブはまだできません。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/35c030f4-a29f-a513-33b9-363dc2849564.png)
# セーブポイントを設ける
これから実際にセーブできるようにしていきますが、その前にFungusにおけるセーブの仕組みについて解説していきたいと思います。

Fungusではブロックの中に**セーブポイントを示すコマンド（Save Pointコマンド）**を入れ、ゲームがそこまで進むとセーブが可能になる仕組みになっています。Save Pointコマンド以降にセーブを行うと、ロードした際にちょうどそのコマンドのところから処理を再開します。
また新しいSave Pointコマンドが出ればセーブポイントが更新され、以後のセーブはそこからの再開になります。また過去のセーブデータも保持されており、セーブ・ロードのメニューにある早送り・巻き戻しボタンを押すことで各セーブポイント間を行き来することができます。
**またSave Pointコマンドはゲームの開始地点にも置く必要があり、これについてはスタート地点であることを示す設定を施します。**そうすればゲーム起動後にそこから処理を始めてくれるのです。
（Game Start条件のブロックからゲームを始めることは今後しません。この条件はセーブポイントから再開した時にも当てはまるので、処理がおかしくなってしまいます）
以下にFungusにおけるセーブポイントの概念を図としてまとめておきました。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/4b27db60-0450-816c-a0e5-495b46c6bdb4.png)
では実際にセーブポイントを仕込んでいってみましょう。ゲームの開始地点になっているブロックの開始条件（Execute On Event）を**「＜None＞」**に切り替え、一番最初に**Save Pointコマンド**を入れます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/69a4a2cc-dc9c-1040-6253-4181c9eb40ec.png)
**Is Start Point欄**にチェックを入れることでこのセーブポイントがゲームの開始地点であるという設定になりますので入れておきましょう。
**Key Mode欄**はセーブポイントにつける名前の設定です。初期状態では**Block Name**となっており、これを選んだ場合は該当ブロックの名称をそのまま名前として使います。**Custom**を選ぶと自分で好きな名前をつけられます。いずれにせよ、ついた名前はコマンド一覧で下図のように「Key: ○○」と示されます。
![4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/1fcf8e8e-a867-9e00-6d75-3c8bb62d240f.png)
残る**Fire Event欄**はチェックなし、**Resume On Load欄**はチェック入りにしておいてください（この2つについてはこの後のロード時の処理に関する節で詳しく説明します）。
続いて、ゲーム中でセーブポイントにしたい所にSave Pointコマンドを入れましょう。こちらではIs Start Point欄のチェックは外しておきます。
ゲームを開始し、セーブとロードを試してみましょう。
# ロード時の処理を作る
セーブ・ロードはうまくいきましたでしょうか？
何か背景やBGMを変更しているブロックにセーブポイントを設けたら上手く再現されなかった……という方もいらっしゃると思います。これは**セーブデータには背景やBGM、GameObjectの配置に関する情報は保存されないため**です。特に問題が起こらなかったという方も、試しに背景・BGM変更直後にセーブポイントを入れてロードしてみてください。おかしなことになるはずです**（状況が保存されていない→その後に改めて設定し直すこともしない→背景もBGMも再現されない）。**
こういった場合にはロード時に発動する処理が必要ですので作ってみましょう。フローチャートに新しいブロックを作り、Execute On Event欄で**「Scene/Save Point Loaded」**を選択します。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/af96967a-a343-53e2-b4fb-8e0f1bc65596.png)
**Save Point Keys**を開き、**Size欄**に何かしら値を入れるとその数だけ**Element欄**ができます。ここに**先ほどSave PointコマンドのKey Mode欄でつけた名前を入力すると、該当のセーブポイントのデータをロードした時にこのブロックが呼ばれます。**Sizeを0にしておけばどこでロードしようが必ず呼ばれる処理にすることもできます。

試しに、ロード時に場面に対応した背景・BGMを読み込み直すブロックを作ってみましょう。これまでに説明したことで可能なので説明は省きますが、下図のようなブロックができると思います。試してみて下さい。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/f88f2c3a-35d1-fab1-ce30-be1c147bbac6.png)
ところでこの処理を応用すればロード時にこれまでのあらすじを表示するような演出も可能です。しかしその場合、場面転換の直後にセーブポイントを持ってくるやり方ですとうまくいきません（本来直後にくる処理とかぶってしまうからですね）。下図のように、背景やBGMの切り替えを終え、プレイヤーに操作を明け渡す直前のところに入れればOKです。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/a37695f4-e507-bb04-4ded-7d6afe265764.png)
注意点として、該当のSave Pointコマンドの**Fire Event欄**のチェックを外しておくのを忘れないようにしておいて下さい……と、先ほど説明を省いたものになりますね。これにチェックを入れてあると、ロードではなく普通に流れでコマンドを実行した際にもロード時条件のブロックを実行するようになります。つまり初めて来たときにも勝手にあらすじを語りだしてしまいます。なので外しておきましょう。
またもう一つ説明を後回しにした**Resume On Load欄**についてですが、これのチェックを外した場合ロード時にそれ以降のコマンドを実行しなくなります。先ほどプレイヤーに操作を明け渡す直前にセーブポイントを……と書きましたがこれを使えば必ずしもそうする必要はなかったりします。ですが、上の図のように場面転換直後のイベントでフラグを立てるなどしている場合バグの原因になる可能性があるので、慣れないうちはあまりおすすめはできません。

初めのうちはややこしいかと思いますが、**セーブポイント絡みで思ったように処理をしてくれない……と思った時はFire Event、Resume On Load、そしてIs Start Point欄の設定を確認してみる**といいと思います。この3つの働きについて以下に図としてまとめましたので参考にして下さい。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/72d5bbca-28d5-5176-4ce2-234a54bfd7e6.png)
# セーブに関する設定を変える
最後にオートセーブ・オートロードの設定について解説します。Hierarchyビューから**最初に追加したSave Menu**を選択し、Inspectorビューで**Save Menuコンポーネント**を探してみて下さい。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/30807a11-049e-6fbe-e0eb-e32cef48aedb.png)
設定はワンクリックでできます。**Load On Start欄に**チェックを入れればオートロードに、**Auto Save欄**にチェックを入れればオートセーブになります。

今回はFungusにおけるセーブ・ロード機能の実装、ロード時の処理の作り方について解説いたしました。
次回は、Fungusに初めから用意されているセリフ表示・選択肢といったUIを作り変える方法について説明したいと思います。

[第7回に進む](https://qiita.com/Kirikabu_ueda/items/5eb99f155191fe157f61)