こちらの記事はGDodt3.xでのGDScriptに関するものとなります。
Godot4.xでは、アノテーションを利用した記述となります。
Godot4.xでのアノテーションについては、 こちら で解説しています。
“onready”キーワードの意味と使い方
GDScriptには”onready”というキーワードがあります。
“onready”キーワードは、ノードを取得する際に使用されます。例えば、スクリプト冒頭に以下のような感じで記載されたりします。
onready var buttonA = get_node("ButtonA")
これはスクリプトの冒頭でノードを取得する際に利用されているのですが、この”onready”キーワードについて理解が不十分だったので、少し調べてみました。
onreadyを使用した変数定義は_ready関数内での変数定義と同じ
まず、結論からお伝えすると、”onready”キーワードをつけた変数宣言は、_ready関数上に記載しているのと同じ意味となります。冒頭で挙げたコードは、以下と同じ意味となります。
func _ready():
var buttonA = get_node("ButtonA")
つまり、”onready”キーワードをつけた変数宣言により、_ready関数上でのコード記載量を削減できるというわけです。
“onready”をつける必要があるのは、ノードを取得する場合
“onready”キーワードの説明としては以上なのですが、もう少し深掘りします。
“onready”をつけないで変数を定義するとエラーが発生したり、逆にonreadyをつけていなくてもエラーにならない場合があります。
onready var i = 1 # エラー発生しない
var j = 1 # エラー発生しない
onready var buttonB = get_node("ButtonB") # エラー発生しない
var buttonA = get_node("ButtonA") # これはエラーが発生する
こちらも結論から言うと、スクリプトファイル冒頭の変数定義において、ノードの取得処理が複jまれている場合は”onready”キーワードが必要となります。
この理由としては、ノードの取得が実施可能になるタイミングの問題と関係があります。
ノードの取得は、シーン内で対象のノードの準備ができたタイミングにならないと実施できません。
この、”ノードの準備ができたタイミング”というのが_ready関数が実行されるタイミングとなるため、ノードの取得処理を含む変数定義に関しては、_ready関数内に記載するのと同義となる”onready”キーワードの記載が必須となるわけです。
※_ready関数とノードの準備に関しては、以下の記事で解説しています。
まとめると、スクリプトファイル冒頭での変数宣言において、このエラーが発生する/しないの違いは、以下となります。
- ノードの取得をする場合(get_node関数の場合)、”onready”キーワードをつけないとエラーとなる
- ノードの取得以外の変数宣言の場合、”onready”キーワードをつける必要はない。(※ただし、つけてもエラーにはならない)