🤖

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

2024/11/13に公開

リロード処理とは

単純に「スクリプト全部再読み込みする」処理と考えていい。
エディタ上で保存されて、その際にロードするみたいで、デバッグ実行している場合F5で再度起動ができる。
ただスプラッシュスクリーンが走ったり再度のアプリ読み込みが入ったりであまり再起動したくない。
そんな時に「アプリ内でシーンの再読み込み」処理を行う事ができる模様。
これを使えば、実行ファイルを再起動せずにスクリプト内容の変更結果を確認できる。

条件

でも上記を行うのに、必要な条件があると思うんだ。

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

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

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

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