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

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

"Godot Engine" GDScript 6 「アンダースコアでバーチャルな関数」... callback or virtual function

前回 “_ready()” 関数がいつ呼ばれるかを、実験で確かめた。この関数のように、呼ばれるタイミングが予め Godot によって決められている関数が他にもあるのだが、関数名に特徴があるので、いくつかまとめておこうと思う。

f:id:ore2wakaru:20170818092425p:plain

Godot の決めたタイミングで
. 関数名 呼び出されるタイミング
1 _ready() シーンにあるノードがシーンツリーに全て追加された時
2 _process(delta) 毎フレーム(描画用)
3 _fixed_process(delta) 毎固定フレーム(物理用)
4 _enter_tree() ノードがシーンツリーに追加された時
5 _exit_tree() ノードがシーンツリーから離れた時
6 _input(event) キー、マウス、パッド、画面タッチなどの入力があった時
7 _unhandled_input(event) ノードが未処理の入力があった時(?)
8 _unhandled_key_input(key_event) ノードが未処理のキー入力があった時(?)

とりあえず、8個持ってきた。探せばもっとあるんだろうけど、API をいっこいっこ見ていくのはツライ。上の8個は、いずれも、公式ドキュメント、「Docs > Godot API > Node」から。

Node — Godot Engine 2.1 documentation

見て分かるとおり、アンダースコア “_” で始まっているのが特徴。見た目で、他の関数と差別化しているようだ。

そういえば、エアホッケーの7で、ボタンを押したとき作られた関数も、アンダースコアで始まっていた。ボタンを押したというタイミングで呼ばれるからだろう。なるほどね。

f:id:ore2wakaru:20170812003554p:plain

ふむふむ、ということは、あれだ、自分で関数を作っていく時には、安易にアンダースコアなんかで始めちゃいけないって事だな、マナー的に。覚えておこう。

virtual(ばーちゃる)ってちょっとツン

あと、もう一つ特徴がある。どれにも “virtual” って言う記述がある。

f:id:ore2wakaru:20170818074010p:plain

本来、Godot の方で、使えるように準備してくれている関数は、関数名だけじゃなくて、関数の中身(ボディ)も定義されているのが普通だ。

今まで使った中だと、"print()“ 関数と "set_text()” 関数か。どちらも、"func print(): [改行]+[インデント] xxxxx" とか、"func set_text(): [改行]+[インデント] yyyyy" とか定義しないで使ったはずだ。普通はこうする。

だが、この “virtual” が付いてると、「呼び出すのはこちらでやって差し上げますけど、中身の方はご自分でご用意なさってください。よろしくて?」という関数であることを意味する。親切なのか、きついのか・・・。

というわけで、前回 “_ready()” は “func _ready(): [改行]+[インデント] zzzzz” みたいにキーワードの “func” を使って中身を書いたわけだ。(専門用語で「再定義」と言うらしい。)中身が無いと怒られちゃうわけだな。だから、あえて何もしない時には、"pass"(パス)って入れておくわけね。なるほどね。これで、キーワードの “pass” もクリアだ。

テンプレ クリア

一応、テンプレで出てくる “extends"、"func"、”_ready()“ 関数、"pass” はクリアだ。・・・長かった。


“print()” 関数が黄色いのもまだ気になるが。("print()“ 関数なんて API のどこに入ってるんだろな~)

ゲーム画面への移行。"godot scene change" こんな感じでググるか。