はじめに
プレイヤーがピックアップアイテムに触れたら、敵のダメージゾーンに入ったら、チェックポイントを踏んだら──こうした「接触を検出して何かをする」という仕掛けを作るならArea3Dが欠かせません。このノードは物理エンジンに統合されながらも、自分は動かず、他のオブジェクトとの接触を監視するという独特の役割を果たします。本記事では、Area3Dの使い方と活用方法を詳しく解説します。
Area3Dとは?
Area3Dは、3D空間上の「見えない触覚」です。自分自身は物理演算の対象にならず、他のオブジェクトがこのエリアに入ったか出たかを検出します。また、そのエリア内の環境パラメータ(重力、ダメージ、スローモーション)を設定することもできます。
たとえ: 電子ゾーン警報、感知地雷、結界。「何かが触れたら反応する」という特性があります。
継承ツリー:
Area3D → CollisionObject3D → Node3D → Node2D版との対応: このノードは2DのArea2Dと同じ役割を3D空間で果たします。

このノードを使うべき場面
使うべき場面:
- ダメージゾーン: 溶岩、トゲ、敵の攻撃範囲。接触したら体力を減らす
- トリガー: 罠の発動、ドア開放、イベント発生
- 水中エリア: 浮力を与える、音を変える、移動速度を変える
- チェックポイント: ステージ進行、セーブポイント、ゴール判定
- ピックアップ範囲: アイテム回収、敵検知、プレイヤー探知
使わない場面:
- 物理的な衝突が必要(RigidBody3D、StaticBody3Dを使用)
- 単純な範囲判定だけなら Area3D を使わず位置判定でも可
主なプロパティと機能
| プロパティ/シグナル | 説明 | デフォルト値 |
|---|---|---|
| monitoring | Area3Dが他のボディを監視するか(false = 無効) | true |
| monitorable | このArea3Dが他のエリアから監視される対象か | true |
| gravity_space_override | このエリア内の重力を制御(DISABLED / COMBINE / COMBINE_REPLACE / REPLACE) | DISABLED |
| gravity | エリア内の重力ベクトル | Vector3(0, -9.8, 0) |
| linear_damp_space_override | エリア内の速度減衰を制御 | DISABLED |
| area_entered | シグナル:別のArea3Dがこのエリアに入った | ─ |
| body_entered | シグナル:RigidBody3D などがこのエリアに入った | ─ |
| body_exited | シグナル:ボディがこのエリアから出た | ─ |
基本的な使用例1:ダメージゾーン
extends Area3D
@export var damage: int = 10
@export var damage_cooldown: float = 1.0
var damaged_bodies = {}
func _ready():
body_entered.connect(_on_body_entered)
body_exited.connect(_on_body_exited)
func _on_body_entered(body):
if body.name == "Player":
# プレイヤーがダメージゾーンに入った
body.take_damage(damage)
damaged_bodies[body] = 0.0
func _on_body_exited(body):
damaged_bodies.erase(body)
func _process(delta):
# クールタイムをカウント
for body in damaged_bodies:
damaged_bodies[body] += delta
if damaged_bodies[body] >= damage_cooldown:
body.take_damage(damage)
damaged_bodies[body] = 0.0
基本的な使用例2:水中エリアで重力を変える
extends Area3D
func _ready():
# このエリア内の重力を上方向に(浮力の効果)
gravity_space_override = Area3D.SPACE_OVERRIDE_REPLACE
gravity = Vector3(0, 5.0, 0) # 上向きの重力
body_entered.connect(_on_body_entered)
body_exited.connect(_on_body_exited)
func _on_body_entered(body):
print(body.name + " が水に入りました")
func _on_body_exited(body):
print(body.name + " が水から出ました")
もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 効果 | 使用例 |
|---|---|---|
| gravity_space_override | REPLACE で無重力、COMBINE で強化、REPLACE で逆重力が可能 | 無重力ゾーン、月面エリア、水中(浮力) |
| gravity | 重力ベクトルを任意の方向・強さに設定 | Vector3(0, 15, 0) で強い上向き浮力 |
| linear_damp_space_override | REPLACE で速度減衰を強制。スローモーション・密集エリア表現 | 蜘蛛の巣、泥沼、時間停止フィールド |
| monitoring | false でこのエリアの監視を一時停止 | トリガーの有効・無効切り替え |
| collision_layer / collision_mask | どのレイヤーのボディを検出するか | 敵のみ検知、プレイヤーのみ検知 |
| get_overlapping_bodies() | 現在重なっているすべてのボディを取得 | 範囲内の敵をすべて列挙、範囲攻撃 |

まとめ
Area3Dは、「接触を検出して何かをする」という仕掛けを作る、ゲーム開発の鍵です。
- body_entered・body_exited・area_enteredシグナルで、接触イベントを検出できます
- gravity_space_overrideで無重力ゾーンや水中環境を表現できます
- collision_layer・collision_maskで細かい検出ルールを作ることで、複雑なゲーム仕掛けを実現できます
次回は、Area3Dなどの3D物理ノードに衝突形状を与えるCollisionShape3Dについて解説します。どんな形のコリジョンを使うかで、ゲームの体感はまったく変わります。
シリーズ:Godot 4 ノード解説
001〜040:各種ノード
041〜060:
041:Node / 042:Node2D / 043:Node3D / 044:Control / 045:Canvas Layer / 046:Sprite2D / 047:Sprite3D / 048:Label / 049:Button / 050:ColorRect / 051:TextureRect / 052:AnimatedSprite2D / 053:AnimationPlayer / 054:CharacterBody3D / 055:PhysicsBody3D / 056:StaticBody3D / 057:RigidBody3D / 058:Area3D / 059:CollisionShape3D / 060:OmniLight3D
この記事はGodot 4.xをもとに執筆しています。


コメント