セーブデータを作るには「Near The Sun」制作記#9

2025 年 5 月 25 日 | カテゴリー: Near The Sun, 製作について

15期のドッグウッドと申します。

本日はセーブデータについてです。初心者の時にハマったところシリーズになります。

「Near The Sun」ではセーブデータをjson形式にして保存しています。
セーブ/ロード自体は簡単で、JsonUtility.ToJson()でセーブデータ化、JsonUtility.FromJson()でセーブデータ読み込み、JsonUtility.FromJsonOverwrite()でスクリプタブルオブジェクトへのセーブデータ読み込みをしているだけです。

じょーさんに暗号化のコードを書いてもらったので、セーブデータを見ただけでは改ざんできなくなっています。

暗号化!


さて、セーブデータでセーブしておくべき情報は以下のつです。
・現在攻略し終わったステージ
・現在持っているアイテムの種類と個数

このゲームではステージ内でのセーブができないのと、主人公の基礎能力が毎回リセットされるため、今どのステージにいて何のアイテムを持っているかだけでセーブデータが構成できます。

これ、ステージ内でセーブができるようにしたかったのですが、今の僕の技術だと難しかったです。通常メトロイドヴァニアではセーブはレストポイントでのみ行うことができるものが多いです。この時にセーブすべき要素は全て一緒にセーブしているのだろうなと思います。
このゲームでもチェックポイントに触れたらオートセーブ、のようにしてもよかったのですが、各ステージで保持しておくべき情報が全く異なる、仕様変更が大変になる、という予想がついたため、ステージの終わりでしかセーブができないようにしました。1ステージ30分ほどなので許してください……。

セーブすべき情報はテキストファイル/スクリプタブルオブジェクトなどにまとめて特定のフォルダに入れておいて、セーブ/ロード時はそのフォルダの中身を丸ごとセーブ、などにすればいいのでしょうか。アップデート時に開閉ドアをステージに増やしたり別オブジェクトに変えたりした場合にセーブデータの互換性を保つのが大変そうですね……。

ちなみに、JsonUtilityで「連想配列はjson化できない」という部分にハマって2年目まではきちんとしたセーブデータが作成されていませんでした。
「連想配列をメンバ変数に持つ自作クラス」はjson化できる上、その場でセーブ/ロードが可能なのでセーブできていると勘違いしていました……。作成されたjsonファイルをよく見ると{instanceID:387875}のようにinstanceIDのみが保存されていたんですね。シーンをロードしなおしてからセーブデータをロードするとインスタンスが見つからずエラーになります。

きちんと連想配列はバラしましょう

まあ連想配列をjson化する拡張もあるらしいので、そちらを使う手もあります。

総じて、そもそもセーブすべき内容を減らしたのがよく効いていると思います。
昔の自分、よくやった!

次回は僕がよく使っているドット絵作成ソフト、Asepriteについて話そうと思います。
ではこの辺で。

コメントはまだありません。