GodotのFileクラスのstore_varというメソッドを使うと、容易にオブジェクトの状態を保存できる。
https://docs.godotengine.org/ja/stable/classes/class_file.html#class-file-method-store-var
store_varで保存したファイルをget_varで簡単に復元することができるので、Godotで色々なオブジェクトの状態を保存/復元する方法として紹介されることがある。便利なので自分のアプリでも使っている箇所があったのだが、今回そのアプリのGodot 4対応を進めようとして思わぬ問題にぶつかってしまった。
https://godotforums.org/d/31966-filestore-var-in-35-to-godot-4/16
フォーラムでも報告している人がいるように、Godot 3系のstore_varメソッドで作成したファイルをGodot 4のget_varで復元しようとすると正しく復元できないのだ。
https://github.com/godotengine/godot/issues/73530#issuecomment-1435792453
残念ながら、これは不具合ではなくGodot 4で想定済みの仕様のようで、今後バージョンアップなどで対応される予定もないそうだ。この問題に対する対策としては、下記の二つの方法が提案されている。
- Godot 4系にアップデートする前に、ファイルをJSONなど別のフォーマットに移行する機能を作る
- 自前でバイナリーローダーを書いて、3系で保存されたバイナリファイルを解読して4系に読み直す
後者は現実的に面倒で難易度も高そうなので、3系のstore_varで作成したデータを引き継ぐには前者の方法をとるしかなさそうだ。ただし、その場合は当面の間3系を使い続けることになってしまうので頭がいたい。
store_varは仕様上今後のアップデートでも同様の問題が起きる可能性があるので、オブジェクトの状態を保存したいときは面倒だがstore_stringとget_as_textを使って自前でシリアライズ/デシリアライズを実装した方が良いようだ。(現在公式ドキュメントのサンプルもそうなっている)