🤖

Godotのソース修正に使うシーンのリロード処理を書く。

2024/11/13に公開

リロード処理とは

単純に「スクリプト全部再読み込みする」処理と考えていい。
GDScriptはGodotのエディタ上で保存されて、その際にロードするみたいで、デバッグ実行している場合F5で再度起動ができる。
すなわちデバッグ中に記述を変更して、その内容を即座に反映できるということ。

ただスプラッシュスクリーンが走ったり再度のアプリ読み込みが入ったりであまり再起動したくない。
そんな時に「アプリ内でシーンの再読み込み」処理を行う事ができる模様。
これを使えば、実行ファイルを再起動せずにスクリプト内容の変更結果を確認できる

ちなみにGodotはGDScriptのソースコードを編集した場合、保存した時点でデバッグ実行している状態でも反映されるので、場合によってはデバッグ実行しなおしすら必要ない。
どういう修正をしたいかを明確にして、必要な処理を実行すればいいと思う。

条件

でも上記のリロード処理を行うのに、必要な条件があると思う。
Godotでは問題ないけど、他環境でも流用することを考えて条件を記載しておく。

1.コンパイル言語ではないこと。(もしくはコンパイルが速い速度で終わること)

これは場合によるけど、実行ファイル形式に固め直す場合、起動ファイルの修正等が発生するし、NGなケースが殆どだと思う。
あと、VMに食わせるケースでもスクリプトに複雑なコンパイルが走るとNGとか。
JITだとそれほど時間かからないと思われる。
一番確実なのはインタプリタ言語とかだよね。

GodotについてはGDScriptの解釈にそれほど時間かけてないのと、保存の際に変換される、もしくはそのまま読んでるみたいなので問題ない模様。

2.デバッグ起動中に書いたソースコードが実行ファイルに反映される

これは実行中に修正したファイルが読み込まれないとダメだよね。

Godotは問題なく動く。
上記の通り、保存すると即時反映されるので便利。
ただオブジェクトの状態はそのままなので、場合によっては動きが変なことになるケースもある。
そういう状態を回避する意味合いでリロード処理を実装するのは便利。

3.再配置に時間がかからないこと・再読み込みで問題が出ないこと

UnityだとIL生成とメモリ再配置?がデバッグ実行中に発生するおかげか大概のケースでは時間かかったり内部リロードでエラーや誤動作等が出ていたことから、同様のケースは避けたい。

幸いGodotは保存処理は動くけどそれ以外の再配置処理で大きく影響はない模様。

どうやって実装する

フォーラムに記述があった
https://forum.godotengine.org/t/reload-current-scene/32365/4

コード

func _input(event):		
	if event.is_action_pressed("reload"):
		get_tree().reload_current_scene()

上記の記述に合わせてインプットマップを変更しておくこと。
https://docs.godotengine.org/ja/4.x/tutorials/inputs/input_examples.html

これでボタンを押すとリロードができるはずなので、ゲームやツール作ったりするのにも役立つはず。

追記

既に記載いただいた人がいた
https://futamori.hatenablog.jp/entry/2022/10/17/211412

Discussion