GameObject ノードと Godot で使用される共通のルートノード
Godot では、ゲームオブジェクトのルートノードとしてさまざまな種類のノードを使用できます。
しかし、現在の ACTION GAME MAKER のバージョンでは、ビジュアルスクリプトは必ず GameObject ノードをルートとして使用する必要があります。
ACTION GAME MAKER の GameObject ノードは Godot の CharacterBody2D をベースとしており、その大部分のコア動作を共有しています。
CharacterBody2D 以外にも、Godot は以下のような他のボディ型ノードを提供しています:
- StaticBody2D
- AnimatableBody2D
- RigidBody2D
場合によっては、Area2D もルートノードとして使用されることがあります。
では、GameObject(CharacterBody2D)とこれらの他のノードの違いは一体何でしょうか?
このドキュメントでは、それらの違いを説明します。
「ボディ」ノードと「非ボディ」ノードの違い
主な違いは以下の通りです:
「CollisionShape2D ベースの衝突システムを使用して物理的に衝突できるかどうか。」
- ボディノードは互いに、またはタイルと衝突でき、押し合い、ブロックし、または互いの上に立つことができます。
- これらの動作は、ボディノードがルートノードとして使用されている場合にのみ正しく機能します。
一方、Area2D は物理的に衝突できませんが、何かが重なったことを検出できます。
簡単に言えば:
- ボディノード → 実際の存在を持つ物理的なオブジェクト
- Area2D → 物理的な存在を持たない不可視のセンサー
各ボディノードの違い
CharacterBody2D(GameObject)
主にプレイヤーや敵などのキャラクターに使用されます。
他のボディを押し、衝突するための擬似物理計算を実行します。
衝突ロジックを継続的に処理するため、計算負荷が高くなります。
StaticBody2D
床や壁など、動かないオブジェクトに使用されます。
衝突は可能ですが、擬似物理を実行しないため、押し戻すことはできません。
このノードは非常に軽量です。
AnimatableBody2D
物理に反応しないが動くことができるオブジェクト用に設計された StaticBody2D のバリエーションです。
他のボディに押し戻されることはありませんが、動くことができるため、CharacterBody2D や RigidBody2D はそれらとの衝突を検出できます。
移動するプラットフォームなどに便利です。
RigidBody2D
完全なリアルな物理シミュレーションを提供します。
質量、摩擦、跳ね返りなどのプロパティを用いて、重い物体が軽い物体を押しのけるような現実的な相互作用を作成できます。
ただし、他のボディノードと衝突する際、それらのノードは「質量なし(または無限の質量)」として扱われるため、RigidBody2D が一方的に押し回されることがあります。
これは CharacterBody2D よりもパフォーマンス負荷が高くなります。
非ボディノード
Area2D
前述の通り、Area2D は物理的に衝突できませんが、重なりを検出できます。
たとえば、Area2D はタイルに触れても自動的に停止しませんが、タイルを検出したときに垂直方向の速度をゼロに設定することで、スクリプトで停止させることができます。
擬似物理を実行しないため、非常に軽量であり、アイテムや壊せるブロックなどのオブジェクトに適しています。
比較表
| ノード | 衝突 | 相互衝突 | 物理 | パフォーマンス |
|---|---|---|---|---|
| CharacterBody2D(GameObject) | はい | はい | 擬似 | 中~高 |
| StaticBody2D | はい | いいえ | なし | 低 |
| AnimatableBody2D | はい | いいえ | なし | 低~中 |
| RigidBody2D | はい | はい | 完全物理 | 高 |
| Area2D | いいえ | いいえ | なし | 低 |
現在、ACTION GAME MAKER のビジュアルスクリプティングシステムは、CharacterBody2D ベースの GameObject ノードのみをサポートしています。
より軽量なノードのサポートは、今後のアップデートで計画されています。