"Godot Engine" GDScript 6 「アンダースコアでバーチャルな関数」... callback or virtual function
前回 “_ready()” 関数がいつ呼ばれるかを、実験で確かめた。この関数のように、呼ばれるタイミングが予め Godot によって決められている関数が他にもあるのだが、関数名に特徴があるので、いくつかまとめておこうと思う。
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」から。
見て分かるとおり、アンダースコア “_” で始まっているのが特徴。見た目で、他の関数と差別化しているようだ。
そういえば、エアホッケーの7で、ボタンを押したとき作られた関数も、アンダースコアで始まっていた。ボタンを押したというタイミングで呼ばれるからだろう。なるほどね。
ふむふむ、ということは、あれだ、自分で関数を作っていく時には、安易にアンダースコアなんかで始めちゃいけないって事だな、マナー的に。覚えておこう。
virtual(ばーちゃる)ってちょっとツン
あと、もう一つ特徴がある。どれにも “virtual” って言う記述がある。
本来、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" こんな感じでググるか。