[Godot] 「ノード」とは?ツリーの関係性、影響範囲

どうも太田アベル(@LandscapeSketch)です。

Godot公式サイトへのボタン
完全無料の高機能ゲームエンジン「Godot」の解説を書いています。
公式サイトはこちら公式ドキュメント(Godot 4)公式ドキュメント(Godot 3)当サイトのGodot記事一覧はこちら

Godotは全てのオブジェクトをツリー状に保持し、ツリー項目は「ノード」と呼ばれます。

あらゆるノードは親にも子にもなることができ、動きやエフェクトなどの効果はノード下のオブジェクトに影響します。

つまり親ノードの座標を動かせば、特に設定をしない限り下位ノードも同じく動きます。この影響をうまく使うことで、ノード単位でグループ的に動作させることができます。

スプライトの下位ノードに体力ゲージを付ければ、スプライトと体力ゲージがいっしょに動くことができるわけです。

公式ドキュメント:ノードとシーン

記事中の商品/サービス

基本のノード

2Dゲームを選択した場合、初期状態でノードは「Node2D」となっています。

Node2Dは座標、角度、大きさなど、基本的なビジュアルプロパティを備えた基底クラスです。

さらにプリミティブな「Node」というクラスもありますが、ビジュアル的な機能はまったく持たないので、非表示オブジェクトなど特別な意図がなければ使いません。

 

いくつかのノードがツリー状にまとまったものを「シーン」と呼びます。

他のゲームエンジンで「シーン」というと、1つの場面やステージ1セットを思い浮かべますが、Godotでは単なるノードのまとまりをシーンと呼ぶので気をつけてください。とにかく複数のオブジェクトが集まれば、全部シーンです。

シーンはファイルとしても切り出すことができ、再利用が可能です。

僕はここでいきなりつまずいていました。1つの場面がシーンと思い込んでいたので、どんなオブジェクトもシーンになったら場面切り替えはどうするのか?と疑問ばかりでした。

Godotは1つの画面もシーンですし、1つ1つのオブジェクトの集まりもシーンです。場面切り替えはその全てを入れ替えたり、増やしたりすればいいだけなのです。

ノードの追加

ノードの追加はカンタン。

親にしたいノードを選び、右クリックから「子ノードを追加」をクリック。クラスの一覧から目的のクラスを追加するだけです。

ノードの影響範囲

ノートの影響範囲を把握します。

基本的に子ノードは親のノードの影響を全て受けます。

 

たとえば単純なSpriteがあり、その下にLabelを配置したとします。

Iconが親、Labelが子となっています。

 

上の状況の場合、LabelはIconからの相対位置になります。表示スクリーン(Viewport)からの絶対位置ではありません。Iconが移動すれば、いっしょにLabelも移動することになります。

 

たとえばキャラクターが動いたらアイテムもいっしょに動かしたい場合、単純にキャラクターの子ノードとして設定すればOK。キャラクターの位置をフックし、いちいち座標計算する必要はありません。

 

また、ノード内の同じ階層の子ノードは、すべてワンセットで効力を発揮します。

親ノード(Area2D)の下に当たり判定(Collision)、スプライト(Sprite)を入れれば、「当たり判定を持ったスプライト」として動きます。互いを設定やコードで結びつけ合う必要はありません。単に階層にすれば良いのです。

重ね合わせ

ノードは「下のノードほど手前に」表示されます。並べ替えるとわかります。

ですが全部がこのルールですと、多数のオブジェクトになったときにツリー管理が非常に大変です。1000発の弾幕シューティングなんて作ったら、自機よりも先に自分の手首が爆発します。(笑)

もちろん解決策があります。

ノードの順番以外には「Z Index」でも設定できます。この値が大きいほど手前、小さいほど(マイナスもあり)奥に表示されます。

例として1000発の弾幕と書きましたが、こんな数は通常ツリーでは作らず、弾をシーンとして作り、あとはスクリプトからクローン生成するのがセオリーでしょう。

コメント