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

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

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

Godotは全てのオブジェクトをツリー状に保持します。

各ツリー項目は「ノード」と呼ばれます。

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

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

記事中の商品/サービス

基本のノード

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

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

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

 

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

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

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

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

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

ノードの追加

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

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

ノードの影響範囲

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

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

 

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

 

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

 

たとえばキャラクターが動いたらアイテムもいっしょに動かしたい場合、単純にキャラクターの子ノードとして設定すればOK。

キャラクターの位置をフックし、いちいち座標計算する必要はありません。

 

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

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

重ね合わせ

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

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

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

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

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

コメント