_ready関数を掘り下げる
GDScriptにてGodot側から準備されている関数の中の一つに、_ready関数があります。
恥ずかしながら、こちらの関数は”最初に実行される”位の認識しかなく、厳密な実行タイミングについて理解ができていないので、今回はこの_ready関数の実行タイミングについて深掘りしてみようと思います。
_ready関数は”シーン内の全ノードが準備できたタイミングで実行される
Godotの公式ドキュメントを確認したところ、GDScriptの_ready関数はシーン内の全ノードが準備できたタイミングで実行されるようです。
そのため、_ready関数においてはシーン内の全ノードが既に存在している前提で処理を記載することができます。例えば、シーン内の他のノードの取得処理を記載する等ができます。
シーン内に複数のスクリプトファイルがアタッチされている場合、子ノードから実行される
では、シーン内に複数のスクリプトファイルがアタッチされている場合、_ready関数の実行順に規則はあるのでしょうか。
こちらも公式ドキュメントを確認してみたところ、子ノード→親ノードの順で各ノードにアタッチしたスクリプトファイル内の_ready関数が順番に実行されるようです。
実際に試してみた
こちらについて、_ready関数の実行タイミングと実行順について、実際に試してみました。
まず、以下のような構成でシーンを作成し、各ノードにスクリプトをアタッチします。
各スクリプトにおいては、_ready関数内にprint関数を配置しておきます。
func _ready():
print("MainNode _ready start.") # ※それぞれアタッチしたノード名に変更している
この状態でシーンを実行すると、以下のようにコンソール出力されました。
ButtonA → ButtonB → SubNode → MainNodeの順で_ready関数が実行されていきました。
公式ドキュメントにあったとおり、子ノード内のノード → 子ノード → 親ノードの順で実行されています。
また、上記例でシーンツリーにおけるButtonAとButtonBのノードの位置を入れ替えたところ、今度は
ButtonB → ButtonA → SubNode → MainNode の順で実行されました。
これより、同一階層にあるノードにおいては、シーンツリーで上から順に_ready関数が実行されていくようです。
まとめ
以上をまとめると、_ready関数の実行タイミングと実行順は以下のようになります。
_ready関数は…
- シーン内のすべてのノードが準備できたタイミングで実行される。
- 子ノード → 親ノードの順に実行される。
- 同じ階層にあるノードにおいては、シーンツリーで上にあるものから順に実行される。