(godot)ノードを削除する前に知るべきこと

QueueFreeをよく使って消していたが、今になって気づいたことがある。

ノード(シーンというべきか)を移行すると基本的にすべてのノードは自動で削除される。

だからわざわざ「QueueFree」を使う必要はなく、非表示にしておくだけで良い。

QueueFreeを使うと少し重いし、エラーが出る可能性があがる。(チェックしてから消すのも手間)

今までなぜ「QueueFree」を頻繁につかっていたかというと、ゲーム画面ばかり作っていたからだ。

つまり、バトルシステムみたいなものを作り、次のモンスターと戦うために初期化していた。そのとき一回すべてのモンスターを削除する必要があると思っていたので消していたのだ。

しかし、実際のゲームはそういう風にはならない。バトルが終わればフィールドに戻ったり町に戻ったりする。その時はシーンを移行するので、自動で消してくれるのだ。

このことに気づくにはゲームに「シーン移行」のコードを書くまで待つ必要があった。

私が今作っているゲームはバトルゲームなので、バトル画面中心のプログラムを書いていた。(約二ヶ月ほど)この1つのシーンしかなかったので、やたら初期化処理をしていたがシーンを以降するのであれば無駄なコードだった。そして、「非表示にする」というコードの意味があまりわからないでいた。

AIに聞いてみても「あとで使う」とか言ってくるが、どういう時に使うかはピンときてなかった。

つまり、どういうことか? バトルでモンスターを倒したときは、QueueFreeを使うのではなく非表示「Visible = false / Hide()」にしておけばよいということだ。そして全てのモンスターを倒し戦闘が終了したらシーンを以降するので、そのタイミングで自動でgodotが削除してくれる。わざわざすべてのモンスターを非表示にしてから削除するのではなく、非表示にしておくだけでいいというわけだ。

QueueFreeをたくさん使うと思わぬエラーが出ることが多くあった。が、非表示だけにしておけばそれがない。ということで、ノードを消すときは基本非表示(処理が軽いし)にしておけばいい。

もちろん作っているゲームによってこれは違ってくるので注意が必要だ。

分かったこと

1、シーン移行の際、Godotが自動で消してくれること

2、非表示にしておくだけで安全に(?)消せるということ

3、消したくないものはAutoloadなど使えばいいこと

これによって多少コードが少なくなった。嬉しい。