Godot Engineで使用するノードに関しての備忘録です。
この記事はGeminiを活用して作成しました。
1. はじめに
Area2D は、2D空間における衝突検知や領域の監視を行うためのノードです。
CharacterBody2D や RigidBody2D のように物理的な衝突で「跳ね返る」「壁で止まる」といった挙動はしませんが、「空間に入ったか・出たか」を検知するのに特化しています。
Playerのルートノードなどに使われます。
主な用途
- アイテムの回収(コインや回復薬)
- ダメージゾーン(罠や地雷)
- ゴール地点の判定
- 敵の索敵範囲(視界に入ったら追跡開始など)
⚠️ 注意:
Area2D単体では動作しません。衝突する形状を定義するために、必ず子ノードにCollisionShape2DまたはCollisionPolygon2Dを追加する必要があります。
2. 代表的なプロパティ
インスペクターでよく設定する、Area2Dの重要なプロパティです。
| プロパティ名 | 説明 |
|---|---|
| Monitoring |
true の時、このエリアが他のエリアやボディを検知するようになります。 |
| Monitorable |
true の時、このエリアが他のエリアから検知されるようになります(弾の当たり判定などはこれをONにする)。 |
| Collision -> Layer | このArea2D自身が属する物理レイヤー。 |
| Collision -> Mask | このArea2Dがスキャン(検知)する対象の物理レイヤー。 |
3. 代表的なシグナル
Area2Dの真価はシグナルにあります。最もよく使われる4つのシグナルです。
-
area_entered(area: Area2D)- 他の
Area2Dがこのエリアに入った瞬間に発動します(弾と敵の当たり判定など)。
- 他の
-
area_exited(area: Area2D)- 他の
Area2Dがエリアから出た瞬間に発動します。
- 他の
-
body_entered(body: Node2D)-
CharacterBody2DやTileMapなど、物理ボディがエリアに入った瞬間に発動します。
-
-
body_exited(body: Node2D)- 物理ボディがエリアから出た瞬間に発動します。
# シグナルの例(コインの回収)
extends Area2D
func _on_coin_body_entered(body): # コインのエリアに入ったとき
queue_free() # 消す
4. 使い方(コイン獲得の実装例)
2Dゲームの超定番である**「プレイヤー(CharacterBody2D)が、ステージに配置されたコイン(Area2D)に触れたら、コインが消える」**という処理を例に、具体的な手順を4つのステップで解説します。
📌 実装の全体フロー
- Step 1: ノード構成の作成(コインの見た目と範囲を作る)
- Step 2: グループの設定(プレイヤーにタグをつける)
- Step 3: シグナルの接続(イベントの入り口を作る)
- Step 4: コードの実装(触れたら消える処理を書く)
🛠️ Step 1: ノード構成の作成
まずは、回収される「コイン」のシーンを作ります。
- 新規シーンを作成し、ルートノードに Area2D を作成します(名前を
Coinに変更)。 -
Coinの子ノードとして、見た目を表す Sprite2D と、当たり判定の範囲を表す CollisionShape2D を追加します。 -
CollisionShape2Dを選択し、インスペクターの「Shape」プロパティで CircleShape2D(円形)などを割り当て、コインの見た目に合わせてサイズを調整します。
【ノード構成】
Coin (Area2D) <-- ここにスクリプトをアタッチする
├── Sprite2D (コインの画像を割り当て)
└── CollisionShape2D (円形の判定を設定)
🏷️ Step 2: プレイヤーのグループ設定
コイン側から見て、ぶつかってきた相手が「プレイヤー」なのか「ただの壁や敵」なのかを判別できるようにするための仕込みをします。
- プレイヤー(
CharacterBody2D)のシーンを開きます。 - プレイヤーのルートノードを選択した状態で、画面右側の「ノード」タブをひらき、「グループ」 ボタンをクリックします。
- 入力欄に
Playerと入力して「追加」を押します。
(これで、プレイヤーノードにPlayerという識別用のタグがつきました)
⚡ Step 3: シグナルの接続
「何かがエリアに入ってきた」というイベントを、スクリプトで扱えるように繋ぎ込みます。
-
Coinノードに新規スクリプト(Coin.gd)をアタッチします。 -
Coinノードを選択した状態で、画面右側の「ノード」タブ > **「シグナル」**の一覧を開きます。 - 一覧にある
body_entered(body: Node2D)をダブルクリックします。 - 接続先として自分自身(
Coin)を選択し、右下の「接続」をクリックします。
これで、コインのスクリプト内に自動的に _on_body_entered という名前の関数が生成されます。
💻 Step 4: スクリプトの記述(完成コード)
自動生成された関数の中に、以下の通り「判定」と「消去」のコードを記述します。
extends Area2D
# 何かがこのエリア(コイン)に入った時に、Godotが自動でこの関数を呼び出す
func _on_body_entered(body: Node2D) -> void:
# 引数「body」には、エリアに入ってきた相手(ノード)の実体が入っている
# 1. 相手が「Player」というグループ(Step 2で設定したタグ)を持っているかチェック
if body.is_in_group("Player"):
print("プレイヤーがコインに触れました!")
# [ここにスコア加算などの処理を挟むことも可能]
# body.add_score(10)
# 2. queue_free() を呼んで、コイン(自身)をゲーム画面から安全に消去する
queue_free()
💡 補足:なぜ queue_free() を使うのか?
Godotではノードを即座に削除する free() もありますが、物理演算やシグナルの処理中にいきなり消すとエラーの原因になります。queue_free() を使うことで、「現在のフレームの処理が安全に終わった直後」にノードを削除してくれるため、安全にアイテムを消去することができます。

