QueueFreeをよく使って消していたが、今になって気づいたことがある。
ノード(シーンというべきか)を移行すると基本的にすべてのノードは自動で削除される。
だからわざわざ「QueueFree」を使う必要はなく、非表示にしておくだけで良い。
QueueFreeを使うと少し重いし、エラーが出る可能性があがる。(チェックしてから消すのも手間)
今までなぜ「QueueFree」を頻繁につかっていたかというと、ゲーム画面ばかり作っていたからだ。
つまり、バトルシステムみたいなものを作り、次のモンスターと戦うために初期化していた。そのとき一回すべてのモンスターを削除する必要があると思っていたので消していたのだ。
しかし、実際のゲームはそういう風にはならない。バトルが終わればフィールドに戻ったり町に戻ったりする。その時はシーンを移行するので、自動で消してくれるのだ。
このことに気づくにはゲームに「シーン移行」のコードを書くまで待つ必要があった。
私が今作っているゲームはバトルゲームなので、バトル画面中心のプログラムを書いていた。(約二ヶ月ほど)この1つのシーンしかなかったので、やたら初期化処理をしていたがシーンを以降するのであれば無駄なコードだった。そして、「非表示にする」というコードの意味があまりわからないでいた。
AIに聞いてみても「あとで使う」とか言ってくるが、どういう時に使うかはピンときてなかった。
つまり、どういうことか? バトルでモンスターを倒したときは、QueueFreeを使うのではなく非表示「Visible = false / Hide()」にしておけばよいということだ。そして全てのモンスターを倒し戦闘が終了したらシーンを以降するので、そのタイミングで自動でgodotが削除してくれる。わざわざすべてのモンスターを非表示にしてから削除するのではなく、非表示にしておくだけでいいというわけだ。
QueueFreeをたくさん使うと思わぬエラーが出ることが多くあった。が、非表示だけにしておけばそれがない。ということで、ノードを消すときは基本非表示(処理が軽いし)にしておけばいい。
もちろん作っているゲームによってこれは違ってくるので注意が必要だ。
分かったこと
1、シーン移行の際、Godotが自動で消してくれること
2、非表示にしておくだけで安全に(?)消せるということ
3、消したくないものはAutoloadなど使えばいいこと
これによって多少コードが少なくなった。嬉しい。