0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[ GODOT 4 ] Area2Dノード

0
Posted at

Godot Engineで使用するノードに関しての備忘録です。

この記事はGeminiを活用して作成しました。

1. はじめに

Area2D は、2D空間における衝突検知領域の監視を行うためのノードです。

CharacterBody2DRigidBody2D のように物理的な衝突で「跳ね返る」「壁で止まる」といった挙動はしませんが、「空間に入ったか・出たか」を検知するのに特化しています。
Playerのルートノードなどに使われます。

主な用途

  • アイテムの回収(コインや回復薬)
  • ダメージゾーン(罠や地雷)
  • ゴール地点の判定
  • 敵の索敵範囲(視界に入ったら追跡開始など)

⚠️ 注意: Area2D 単体では動作しません。衝突する形状を定義するために、必ず子ノードに CollisionShape2D または CollisionPolygon2D を追加する必要があります。
image.png


2. 代表的なプロパティ

インスペクターでよく設定する、Area2Dの重要なプロパティです。

プロパティ名 説明
Monitoring true の時、このエリアが他のエリアやボディを検知するようになります。
Monitorable true の時、このエリアが他のエリアから検知されるようになります(弾の当たり判定などはこれをONにする)。
Collision -> Layer このArea2D自身が属する物理レイヤー。
Collision -> Mask このArea2Dがスキャン(検知)する対象の物理レイヤー。

image.png


3. 代表的なシグナル

Area2Dの真価はシグナルにあります。最もよく使われる4つのシグナルです。

  • area_entered(area: Area2D)
    • 他の Area2D がこのエリアに入った瞬間に発動します(弾と敵の当たり判定など)。
  • area_exited(area: Area2D)
    • 他の Area2D がエリアから出た瞬間に発動します。
  • body_entered(body: Node2D)
    • CharacterBody2DTileMap など、物理ボディがエリアに入った瞬間に発動します。
  • body_exited(body: Node2D)
    • 物理ボディがエリアから出た瞬間に発動します。
# シグナルの例(コインの回収)
extends Area2D
func _on_coin_body_entered(body): # コインのエリアに入ったとき
    queue_free() # 消す

4. 使い方(コイン獲得の実装例)

2Dゲームの超定番である**「プレイヤー(CharacterBody2D)が、ステージに配置されたコイン(Area2D)に触れたら、コインが消える」**という処理を例に、具体的な手順を4つのステップで解説します。


📌 実装の全体フロー

  1. Step 1: ノード構成の作成(コインの見た目と範囲を作る)
  2. Step 2: グループの設定(プレイヤーにタグをつける)
  3. Step 3: シグナルの接続(イベントの入り口を作る)
  4. Step 4: コードの実装(触れたら消える処理を書く)

🛠️ Step 1: ノード構成の作成

まずは、回収される「コイン」のシーンを作ります。

  1. 新規シーンを作成し、ルートノードに Area2D を作成します(名前を Coin に変更)。
  2. Coin の子ノードとして、見た目を表す Sprite2D と、当たり判定の範囲を表す CollisionShape2D を追加します。
  3. CollisionShape2D を選択し、インスペクターの「Shape」プロパティで CircleShape2D(円形)などを割り当て、コインの見た目に合わせてサイズを調整します。

【ノード構成】

Coin (Area2D)  <-- ここにスクリプトをアタッチする
├── Sprite2D (コインの画像を割り当て)
└── CollisionShape2D (円形の判定を設定)

🏷️ Step 2: プレイヤーのグループ設定

コイン側から見て、ぶつかってきた相手が「プレイヤー」なのか「ただの壁や敵」なのかを判別できるようにするための仕込みをします。

  1. プレイヤー(CharacterBody2D)のシーンを開きます。
  2. プレイヤーのルートノードを選択した状態で、画面右側の「ノード」タブをひらき、「グループ」 ボタンをクリックします。
  3. 入力欄に Player と入力して「追加」を押します。
    (これで、プレイヤーノードに Player という識別用のタグがつきました)

⚡ Step 3: シグナルの接続

「何かがエリアに入ってきた」というイベントを、スクリプトで扱えるように繋ぎ込みます。

  1. Coin ノードに新規スクリプト(Coin.gd)をアタッチします。
  2. Coin ノードを選択した状態で、画面右側の「ノード」タブ > **「シグナル」**の一覧を開きます。
  3. 一覧にある body_entered(body: Node2D) をダブルクリックします。
  4. 接続先として自分自身(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() を使うことで、「現在のフレームの処理が安全に終わった直後」にノードを削除してくれるため、安全にアイテムを消去することができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?