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

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

Godot Engine GDScript 12 「神シーン常駐システム完成」...2/2

前回は「シーンGOD」のルートノード「Node_GOD」用スクリプトの話だったが、今回は「シーンA」のルートノード「Node」用スクリプトの事に関して書く。この2つの記事を併せて「神シーン常駐システム」完成ということでいいだろう。基本部分だけだけど。

f:id:ore2wakaru:20170825170907p:plain

「シーンA」、「Node」用スクリプト

こちらもいきなり答え。こちらのスクリプトもファイル名はなんでもいい。注意点はひとつだけ。「Button」ノードの右のアイコンを見れば分かる通り、このボタンには「ボタンを押すと何かする」の機能を付加している。忘れずに。(やり方を忘れている場合は、「エアホッケーの7」、「GDScriptの9」で復習)

f:id:ore2wakaru:20170903153020p:plain

【解説】

◆ 1~4行目:

extends Node

func _ready():
    pass

特になし。

◆ 6~8行目:

func _on_Button_pressed():
    get_node("/root/Node_GOD").my_remove_sn_A()
    get_node("/root/Node_GOD").my_add_sn_B()

ボタンが押されたら、「シーンGOD」の「Node_GOD」に付けたスクリプト中で定義した my_remove_sn_A()my_add_sn_B() を呼ぶ。それぞれの関数がどんな仕事をするものかは、前回。

「 get_node() でのノード指定の仕方 その2 」

前回は、「自分」ノードから上位階層・同一階層・下位階層と、相対的にノードを指定するやり方を利用したが、今回は、「シーンツリーのルート」ノードから指定する方法を利用する。そのやり方は簡単。 “/root/XXXX” のようにすればいい。これで、相対指定と絶対指定の2通り出来るようになった。

ただ、やはり忘れてならないのは、Godot のゲーム実行の仕組みで、内部に持った「Viewport」にユーザーが作った「シーン」をくっつけていく構成になっている事だ。(「GDScriptの5、シーンツリー参照」)

つまり、今回メインシーンとして設定した「シーンGOD」が最初に読み込まれた時、「シーンGOD」のルートノード「Node_GOD」は、「シーンツリー」のルートノード「Viewport」の子としてくっついたわけだ。

そして「シーンGOD」は今後シーンツリーから外すことはないので、ずっと居座る形となる。これでいつでも上記のように、get_node("/root/Node_GOD") として変わらずにどこからでも操作対象として指定することが出来るという事だ。(常駐システム)

「Node_GOD」に付けたスクリプトで定義した関数を呼び出すには、上記のように get_node() で対象のノードを指定し、ドット “.” を挟んで関数名を書いてやればいい。(スクリプトファイル名じゃなくて、添付したノードを指定するのはちょっと不思議。)

「 先にはがして大丈夫? 」

また、ちょっと注意したいのは、関数の記述の順番だ。「シーンA」をシーンツリーから引きはがしてから「シーンB」を貼り付けるようにしているが、先に「シーンA」を引きはがしてしまっては、この時点でノードごとスクリプトが消え去るので、本当は「シーンB」を貼り付ける動作が為されなずここで終わるのでは? と思われる。

しかし今回 my_remove_sn_A() では queue_free() を使っている為、先に「シーンA」を引きはがそうとしても、残りの動作(シーンBの貼り付け)が残っているとみなされ、これが終了するまでシーンツリーから削除されない。(キューに残っているって事なんだろうなキット) だから、大丈夫だ。

また逆に、先に「シーンB」を付けて、その後「シーンA」をはがす順番にすれば、my_remove_sn_A()free() を使っても問題ないハズ。

これで、完成。なので、

テストと確認

をしよう。[ゲーム再生] ボタンを押せば、

f:id:ore2wakaru:20170903174849p:plain

こうなったハズだ。

しかし、これでは今一、ちゃんとシーンが外されたり、追加されたりしているのか不明だ。そこで、いつもは [Output] になっている下のパネルを [Debugger] > [Remote Inspector] にしてみよう。シーンツリーの変化をほぼリアルタイムで確認できる。

シーンを再生してから、

f:id:ore2wakaru:20170903181325p:plain

で、確認だ。ボタンを押すと、シーンAの部分のノード達がマルっと消えているのが分かる。ふむ。



ということで、「神シーン常駐システム」の基本部分が完成、テストもOK、確認もOKとなった。次回からこれをエアホッケーゲームに組み込もうと思う。

あと、ちょと失敗したかなーと思ったのは、コメント入れておけばよかったかな、func _on_Button_pressed(): の上に。どこの誰のボタンか分からんもんな。