俺に解るように説明する "Godot Engine 3.x" 入門+

ゲームエンジン Godot Engine に関すること。入門とか使い方とかチュートリアルとか、あれとかこれとか。日本語解説。

"Godot Engine" GDScript 5 「func _ready(): とは」...こども優先

ノードに貼り付けるスクリプトのテンプレは3種類だった。比べてみると、やはりどう見ても、多からず、少なからず、"No Comments" がシンプルで使いやすそう。今回は、このテンプレで、"extends" の次に出てくる “func _ready():” を片づけよう。

f:id:ore2wakaru:20170817172442p:plain

ちなみに、”Default” のテンプレで出てくる ”#” はコメントを書くときに使う。このマーク以降はコメント。ただし、1行だけ。複数行コメントのマークは無いくさい。

大抵、プログラムって自分で書いてても2週間見ないと、何やってるか忘れる。思い出しやすい様に処理内容や注意書きを残しておくのが得策。前に書いたっけ?

func(ふぁんく)

見れば分かるとおり “func” は黄色く識別されている。黄色い文字は・・・、「キーワード」、だった。キーワードと言うのは、Godot がその使い方を決めている語で、公式のドキュメントに当たると、こうある。

GDScript — Godot Engine 2.1 documentation

Keyword(キーワード) Description(どんな事をするのかの説明)
func Defines a function.「関数を定義します。」

これは余裕だ。GDScript で関数を定義したければ、

f:id:ore2wakaru:20170817191103p:plain

  1. “func” とやって、ちょっと間開けて
  2. 関数名を書いて、
  3. “()” を付けて、
  4. “:” を付けて、
  5. 改行して
  6. 次の行にインデントを入れてから、
  7. 中身を書けばいい。中身が複数行の時は、全行揃ってインデントが必要。

楽勝。しかも、英語の function (発:ファンクション、意:関数)から持ってきたってバレバレだな。問題なのは、”_ready()” の部分だ。

_ready()(あんだーすこあ れでぃー)

関数で注意しなければいけないのは、(すでに Godot によって定義されていて)Godot が決めたタイミングで自動的に呼ばれる関数があるって言う事だ。Unity や UE4 で言う所のイベント関数に該当するものだと思う。

この “_ready()” もそのひとつ。で、こいつがどのタイミングで呼ばれるかと言うと、、、Docs > Godot API > Node で確認だ。

Node — Godot Engine 2.1 documentation

f:id:ore2wakaru:20170817195332p:plain

簡単に言うと、「シーンにあるノードが全部シーンツリーに追加された時この関数が呼ばれる。子ノードが先に呼ばれて、その後に親ノードが呼ばれる。」という事だ。

ちょと厄介なのは、シーンツリー。

シーンツリー

シーンツリーと言うのは、簡単に言うと、「Viewport」というノードをルートノードに持った Godot によって既に準備されているシーンの事。「Viewport」いっこしか持ってない。

例えば、画面表示は、このシーンツリーと呼ばれる部分に、せっせこエディターで作ったシーンの中のノードを、Godot 君が追加していくことで実現している。以下図解。

f:id:ore2wakaru:20170817214134p:plain

Unity や UE4 ではカメラを明示的にシーンに置くことで、画面を表示させている(確かそう)。だが、俺は Godot でエアホッケーのスタート画面を作った時、カメラノードのようなものを追加していない。にもかかわらず、画面表示が出来た。

これは、[シーン再生] ボタンを押した時 Godot 君が、よいしょよいしょと、ノードをシーンツリーに追加していってくれていたからだ。ありがとう、Godot 君。

カメラいらないんだ、でもなんで画面が表示されるんだろ、不思議だな、と思っていたのだが、こういう事だったのだ。

隠れルートノード「Viewport」、恐るべし。そして、もう一度、ありがとう、Godot 君。

再び _ready()

そして、シーンの中の全部のノードが「Viewport」がルートであるシーンツリーに追加完了時、この “_ready()” 関数が呼ばれるという事だ。(ちなみに追加していく時は親ノードからシーンツリーに追加する。)

そしてさらに、注意したいのは、ノードが “ready"(準備できたよー)となるのには、順番があるってところだ。英文でも書いてあるのだが、子ノードから順に "ready” になる。つまり、階層構造が4階層のシーンの場合は、最下層である 4階層目 > 3階層目 > 2階層目 > ルート の順に上ヘ上へと “_ready()” 関数が呼ばれるという事だ。

確か、Unity はスクリプトが呼ばれる順番はいいかげんだった気がしたけど、Godot は順番があるんだな。

実験コーナー

こんな感じでシーンを作って、それぞれにスクリプトを付けて、シーンを [再生] させてみた。

f:id:ore2wakaru:20170817223202p:plain

下から順に “ready” っておもろいな。


他にも、"_ready()“ みたいに、Godot が決めたタイミングで自動的に呼ばれる関数はいくつかあるが、出てきた順に覚えていこうと思うが、、、。

あれ? なんか “print()” 関数、黄色いぞ!? 黄色い文字は・・・、"print()“ 関数はキーワードじゃなーい。

“print()” なんて、コンソールに文字列表示するやつでしょ、ぐらいに思っていたけど、ちょっと調べてみるかな。関数の基本的な事。ぐは。