マニュアル: GameObjectノードとGodotの各Bodyノードについて

GameObjectノードと、Godotでよくルートノードとして利用されるノード

Godotでは、さまざまなタイプのノードをゲームオブジェクトのルートとして利用できます。しかし、現時点では ACTION GAME MAKER のヴィジュアルスクリプトでは GameObject ノードをルートノードにする必要があります。

ACTION GAME MAKER の GameObject ノードは Godot の CharacterBody2D をベースとしており、基本的な挙動も同様です。

一方、Godot には CharacterBody2D 以外にも以下のような「Body」を含むノードがあります。

  • StaticBody2D
  • AnimatableBody2D
  • RigidBody2D

また、場合によっては Area2D をルートノードとして使うケースもあります。

では、GameObject(=CharacterBody2D)とこれらのノードには具体的にどのような違いがあるのでしょうか?
このマニュアルではその点について解説します。


Body の名のついたノードと、つかないノードの違い

最大の違いは、
「CollisionShape2D を使った衝突システムで衝突できるかどうか?」
です。

  • Body ノード同士、または Body ノードとタイルは互いに衝突し、押し合ったり、ぶつかって止まったり、地面に立ったりできます。
  • これらの挙動は「Bodyノードがルートノードである場合」にのみ正しく動作します。

一方、Area2D は Body ノードやタイルと物理衝突はできませんが、衝突“したこと”を検知できます。

イメージとしては、

  • Body ノード → 実体を持つオブジェクト
  • Area2D → 実体を持たないセンサー

と考えると分かりやすいです。


各 Body ノードの違い

CharacterBody2D(GameObject)

主にプレイヤーや敵など「キャラクター」に使われるノードです。
疑似物理による処理を行うため、押し合いや押しのけなどが可能です。
ただし、常に衝突処理を計算するため 負荷は比較的高め です。


StaticBody2D

床や壁など「動かないもの」に使用されます。
衝突は可能ですが疑似物理処理を行わないため、プレイヤーに押されることはありません。
負荷は低い ノードです。


AnimatableBody2D

StaticBody2D の亜種で、「動くが物理的には影響を受けない」オブジェクトに使用します。
他の Body ノードによって押されることはありませんが、動く能力を持つため、CharacterBody2D から衝突検知できます。
移動プラットフォームなどに利用できます。


RigidBody2D

Godot の本格的な物理処理を行うノードです。
重量、摩擦、反発などを設定することでよりリアルな物理挙動になります。

ただし、他の Body ノードと衝突すると、他の Body 側は「質量ゼロ(厳密には無限大)」として扱われるため、RigidBody2D が一方的に押される場合があります。

CharacterBody2D よりさらに負荷は高めです。


非Bodyノード

Area2D ノード

衝突はできませんが「検知」はできます。
例えば、タイルと衝突したら自動停止する挙動はできませんが、タイルを検知してスクリプトで速度を0にする、といった実装は可能です。

疑似物理を行わないため 軽量 で、アイテムや壊せるブロックなどに向いています。


各ノードの比較表

ノード名 衝突処理 相互の衝突 物理処理 処理負荷
CharacterBody2D (GameObject) 有り 可能 疑似物理 中〜高
StaticBody2D 有り 不可 無し 低い
AnimatableBody2D 有り 不可 無し 低〜中
RigidBody2D 有り 可能 完全物理 高い
Area2D 無し 不可 無し 低い

ACTION GAME MAKER では現時点で GameObject(=CharacterBody2D)しか利用できませんが、将来的にはより軽量なノードにも対応できるよう継続開発中です。

2 Likes