Godot入門:Area3Dの使い方と活用法

はじめに

プレイヤーがピックアップアイテムに触れたら、敵のダメージゾーンに入ったら、チェックポイントを踏んだら──こうした「接触を検出して何かをする」という仕掛けを作るならArea3Dが欠かせません。このノードは物理エンジンに統合されながらも、自分は動かず、他のオブジェクトとの接触を監視するという独特の役割を果たします。本記事では、Area3Dの使い方と活用方法を詳しく解説します。

Area3Dとは?

Area3Dは、3D空間上の「見えない触覚」です。自分自身は物理演算の対象にならず、他のオブジェクトがこのエリアに入ったか出たかを検出します。また、そのエリア内の環境パラメータ(重力、ダメージ、スローモーション)を設定することもできます。

たとえ: 電子ゾーン警報、感知地雷、結界。「何かが触れたら反応する」という特性があります。

継承ツリー:
Area3D → CollisionObject3D → Node3D → Node

2D版との対応: このノードは2DのArea2Dと同じ役割を3D空間で果たします。




Area3Dの接触検出
Area3Dは他のオブジェクトの出入りを検出し、シグナルで通知します

このノードを使うべき場面

使うべき場面:

  • ダメージゾーン: 溶岩、トゲ、敵の攻撃範囲。接触したら体力を減らす
  • トリガー: 罠の発動、ドア開放、イベント発生
  • 水中エリア: 浮力を与える、音を変える、移動速度を変える
  • チェックポイント: ステージ進行、セーブポイント、ゴール判定
  • ピックアップ範囲: アイテム回収、敵検知、プレイヤー探知

使わない場面:

  • 物理的な衝突が必要(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() 現在重なっているすべてのボディを取得 範囲内の敵をすべて列挙、範囲攻撃




gravity_space_overrideの設定
gravity_space_overrideで、エリア内の重力を完全に制御できます

まとめ

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をもとに執筆しています。

コメント