皆様いかがお過ごしでしょうか。歌乃です。
あいも変わらずUEを弄り回してます。少しづつ思ったことが出来るようになるのが面白い。
今回はゲーム内データの保存に関してです。
といってもUEにはゲーム内データの保存に関してとても便利な機能が用意されているので単にそれを利用するだけです。
以下のような読者を対象にしてます。
前回の記事 > User Interface の実装。
ゲーム内データの保存に関しては色々なアプローチの仕方があると思いますが、UEではSaveGameクラスという、まさにその用途のために用意されたクラスがあります。
小~中規模のゲームであれば、十分に機能すると思われます。
使い方もシンプルで、BPの作成からSaveGameクラスを選び、そのクラスに保存したいデータを変数として登録します。
Stringやfloat、Vectorのデータが使えます。
保存の手順はシンプルで「Save Game to Slot」関数を使用します。
「Save Game Object」に先に制作したSaveGameクラスを指定し、Slot Nameに保存先のファイル名をStringで指定します。
保存先のファイルは無ければ自動で作成され、ある場合は上書きされます。
複数の保存先を作りたい場合は、Slot Nameを変えて保存します。
保存ファイルはプロジェクト配下の「Saved」フォルダーの中に保存されます。
「Save Game to Slot」は非同期ではないので保存データが肥大すればするほど、時間がかかるようになります。
「Async Save Game to Slot」という非同期で保存できる関数が用意されているので、ある程度以上のデータの場合はそちらを使ったほうがいいかもしれません。
保存データに関しては、保存前にSaveGameクラスに登録した変数にアクセスして値を変更しておく必要があります。
データの読み込みも簡単です。
「Load game from Slot」関数で保存時に指定したスロット名(ファイル名)を使って読み込みます。
読み込みが終わったらSaveGameオブジェクトが返ってくるので、先に自作したSaveGameクラスにcastします。
その後、そのSaveGameクラスから変数を読み出せば、保存した値が取得できます。
何らかの理由で読み込みに失敗するとnullが返ってきます。
save game to slot と同様に「Load Game from Slot」は非同期ではないので保存データが肥大すればするほど、読み込みに時間がかかるようになります。
同じように「Async Load Game from Slot」という非同期の読み込み関数が用意されているので状況に応じてそちらの使用も検討するといいかもしれません。
SaveGameクラスは、クラスの変数に直接書き込んでそのままファイルに保存できるというお手軽さが気に入ってます。
が、いまのところ単純なデータしか扱ってないので、今後複雑なデータを大量にもたせた場合は何らかの不都合が起きる可能性も否定はできません(´・ω・`)