アイテムに近づいたら拾う。敵の索敵範囲に入ったら追いかけられる。毒沼に立っている間だけHPが減る。イベントエリアに入ったら会話が始まる。
こうした「ぶつかって止めたいわけではないけれど、範囲に入ったことは知りたい」処理に使うのが Area2D です。

この記事でわかること
- Area2Dが「通り抜けるセンサー」である理由
body_entered/body_exited/area_enteredの使い分け- 敵の索敵範囲、毒沼、アイテム取得の実装例
- Collision Layer / Maskで検出対象を絞る考え方
動作確認環境: Godot 4.7
Area2Dは「衝突」ではなく「検出」
Area2D は、物理的に押し返すためのノードではありません。キャラクターがArea2Dへ入っても、Area2D自体は壁のように動きを止めません。
| ノード | 主な役割 | プレイヤーの移動を止めるか |
|---|---|---|
StaticBody2D | 床、壁、固定障害物 | 止める |
CharacterBody2D | プレイヤー、敵、NPC | 動かし方次第で衝突する |
RigidBody2D | 箱、ボール、物理オブジェクト | 物理的に押し合う |
Area2D | センサー、範囲、トリガー | 止めない |
Area2Dは、ゲーム内では次のような用途に向いています。
- アイテム取得範囲
- 敵の索敵範囲
- 攻撃判定
- 毒沼や回復エリア
- ワープゾーン
- 会話やカットシーン開始トリガー
「触れたら反応したい」ならArea2D、「ぶつかって止めたい」なら物理ボディ、と考えると選びやすいです。
Area2Dの基本構成
Area2Dを機能させるには、子に CollisionShape2D または CollisionPolygon2D が必要です。Area2D本体だけを置いても、検出範囲がないため反応しません。
PickupArea (Area2D)
└─ CollisionShape2D
基本の流れは次の通りです。
Area2Dを作る- 子に
CollisionShape2Dを追加する - 検出したい範囲の形を設定する
body_enteredなどのシグナルを接続する- 必要ならCollision Layer / Maskを設定する
Area2Dは見えない範囲として使うことが多いため、エディタ上でCollisionShape2Dの形を見ながら調整します。
bodyとareaのシグナルを使い分ける
Area2Dで最初に迷いやすいのが、body_entered と area_entered の違いです。
| シグナル | 何が入ったときに呼ばれるか | 例 |
|---|---|---|
body_entered(body) | CharacterBody2D、RigidBody2D、StaticBody2D など | プレイヤーがアイテム範囲に入る |
body_exited(body) | 物理ボディが範囲から出る | プレイヤーが索敵範囲から出る |
area_entered(area) | 別の Area2D | 攻撃判定が敵の HurtBox に当たる |
area_exited(area) | 別の Area2D が範囲から出る | センサー同士の重なり終了 |
Area2Dのシグナルは、入った瞬間と出た瞬間を扱うのに向いています。範囲内にいる間ずっと処理したい場合は、入った対象を配列に入れ、出たら配列から外し、_physics_process() で処理する形が分かりやすいです。

extends Area2D
var targets: Array[Node2D] = []
func _on_body_entered(body: Node2D) -> void:
if body.is_in_group("player") and not targets.has(body):
# 入った瞬間にリストへ追加する
targets.append(body)
func _on_body_exited(body: Node2D) -> void:
if targets.has(body):
# 出た瞬間にリストから外す
targets.erase(body)
この形にすると、「入った瞬間の処理」と「範囲内にいる間の処理」を分けて考えられます。
実装例1: 敵の索敵範囲
敵の子に Area2D を置くと、索敵範囲を作れます。
Enemy (CharacterBody2D)
├─ Sprite2D
├─ CollisionShape2D
└─ SightArea (Area2D)
└─ CollisionShape2D
SightArea は敵本体の衝突とは別です。プレイヤーが索敵範囲に入っても、そこで止まるわけではありません。入ったことを検出して、敵AIの状態を変えます。
