本文へスキップ
Godot基礎

GodotのArea2Dでコインを拾う|接触判定と取得数の表示をつなぐ

Godot 4.5で、プレイヤーがコインに触れると取得数が1増える例を作ります。Collision LayerとMask、body_entered、シグナル接続、二重取得の防止を図とコードで解説します。

公開日: 2026-10-24#Godot#GDScript#Area2D#シグナル#初心者
ガイドキャラクター
Godot 4.5で、プレイヤーがコインに触れると取得数が1増える例を作ります。Collision LayerとMask、body_entered、シグナル接続、二重取得の防止を図とコードで解説します。
学習者キャラクター
準備するものと、動作確認で見る結果を先に確認してから進めます。
GodotのArea2Dでコインを拾う|接触判定と取得数の表示をつなぐの手順と判断条件を示す説明図
仕組みを説明する模式図です。エディタのスクリーンショットではありません。小さい画面では横にスクロールできます。設定値と手順は本文で確認してください。

この記事で作るもの

矢印キーで青いプレイヤーを動かし、黄色いコインに触れると「コイン: 0」が「コイン: 1」へ変わる例を作ります。Godot 4.5・GDScript・2Dを使います。ジャンプや床のない、上から見た移動です。

Area2Dは、範囲へ入った物を検出するノードです。今回はbody_enteredでCharacterBody2Dの接触を受け取り、独自のpicked_upシグナルで画面側へ取得を知らせます。通知を受けた側が数を更新します。Area2Dの公式資料

1. ノードを配置する

Node2Dをルートにして、次の構成をcoin_demo.tscnへ保存します。名前と親子関係をそろえます。

CoinDemo (Node2D)                 ← CoinDemo.gd
  Player (CharacterBody2D)        ← CoinDemoPlayer.gd
    Polygon2D
    CollisionShape2D
  Coin (Area2D)                   ← PickupCoin.gd
    Polygon2D
    CollisionShape2D
  CanvasLayer
    CoinLabel (Label)

外部の画像素材を使わず、Polygon2Dで簡単な見た目を作ります。Polygonプロパティの配列を展開し、頂点を次の順に設定します。各Polygon2DとCollisionShape2DのPositionは(0, 0)のままにします。

対象設定
PlayerPosition (100, 200)、Motion ModeはFloating
PlayerのPolygon2D頂点 (-16,-16), (16,-16), (16,16), (-16,16)、Colorは青
PlayerのCollisionShape2D新規RectangleShape2D、Size (32, 32)
CoinPosition (300, 200)、Monitoringはオン
CoinのPolygon2D頂点 (0,-20), (16,0), (0,20), (-16,0)、Colorは黄色
CoinのCollisionShape2D新規CircleShape2D、Radius 16
CoinLabelPosition (24, 24)、Text コイン: 0

検出する層を合わせる

InspectorのCollisionで、PlayerのLayerは1だけオン、Maskはすべてオフにします。CoinのLayerは2だけオン、Maskは1だけオンにします。「2だけ」はビット一覧の2番目だけをチェックする意味です。

CoinはMaskの1番を使って、Layerの1番にいるPlayerを探します。Player側のMaskをCoinへ向ける必要はありません。この例では壁との衝突を使わないのでPlayerのMaskを空にしています。壁を追加する場合は別途設定が必要です。LayerとMaskの公式資料

2. プレイヤーを動かす

PlayerへCoinDemoPlayer.gdを付けます。既定のui_left・ui_right・ui_up・ui_downを使うので、まず矢印キーで試します。WASDへ変える場合はInput Mapの基本を参考に設定します。

extends CharacterBody2D

@export var speed: float = 180.0

func _ready() -> void:
    add_to_group("player")

func _physics_process(_delta: float) -> void:
    var direction := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
    velocity = direction * speed
    move_and_slide()

velocityは速度なので、ここでさらにdeltaを掛けません。move_and_slide()が物理フレームの時間を扱います。グループplayerはコードで登録しており、コイン側が取得対象を見分けるために使います。CharacterBody2Dの公式資料

3. コインが取得を通知する

CoinへPickupCoin.gdを付けます。picked_upは自分で定義する、引数なしのシグナルです。

extends Area2D

signal picked_up

var collected := false

func _ready() -> void:
    body_entered.connect(_on_body_entered)

func _on_body_entered(body: Node2D) -> void:
    if collected or not body.is_in_group("player"):
        return

    collected = true
    hide()
    picked_up.emit()
    queue_free()

collectedを通知前に立てるので、同じコインに接触通知が続いても1回だけ取得します。hide()で見た目を消し、queue_free()でフレーム末尾にノードと子を削除します。削除は即時ではないため、先に取得済みの状態を記録しています。queue_freeの公式資料

4. 取得数を表示する

ルートのCoinDemoへCoinDemo.gdを付けます。コインからの通知を受けて、Labelを更新します。

extends Node2D

@onready var coin_label: Label = $CanvasLayer/CoinLabel
var coins: int = 0

func _ready() -> void:
    $Coin.picked_up.connect(_on_coin_picked_up)
    _update_label()

func _on_coin_picked_up() -> void:
    coins += 1
    _update_label()

func _update_label() -> void:
    coin_label.text = "コイン: %d" % coins

body_enteredもpicked_upもコードで接続しています。エディタのシグナル一覧で同じ処理を重ねて接続しません。ここではコイン1個に絞っています。コインを複数へ増やすときは、それぞれのシグナルを管理役へ接続する処理も必要です。Signalの基本

動作確認

coin_demo.tscnを開き、F6でそのシーンを実行します。

操作期待する結果
起動する青い四角と黄色いコイン、「コイン: 0」が見える
矢印キーで動くプレイヤーが上下左右へ移動する
コインへ触れるコインが消え、表示が「コイン: 1」に変わる
元の位置を何度も通る表示は1のまま増えない
実行を止めてF6で起動し直すコインが戻り、表示は0から始まる

うまく動かないとき

  • 姿が見えない:Polygon2Dの頂点とColorを確認します。CollisionShape2Dだけでは通常のゲーム画面に絵は出ません。
  • 重なっても反応しない:CoinのMonitoring、CollisionShape2DのShape、PlayerのLayer 1とCoinのMask 1を確認します。
  • 数が増えない:CoinDemo.gdをルートへ付け、CoinとCanvasLayer/CoinLabelの名前を確認します。Debuggerのエラーも確認します。
  • 1個で2増える:コードとエディタで同じシグナルを二重接続していないか確認します。

この例はコインの出現し直しや、終了後の取得数保存を含みません。接触判定・取得通知・表示更新を分けて理解してから広げます。

学習者キャラクター
今回の内容で覚えておくポイントを確認したいです。
ガイドキャラクター
Godot 4.5で、プレイヤーがコインに触れると取得数が1増える例を作ります。Collision LayerとMask、body_entered、シグナル接続、二重取得の防止を図とコードで解説します。
この記事のまとめを案内するガイドキャラクター

この記事のまとめ

Godot 4.5で、プレイヤーがコインに触れると取得数が1増える例を作ります。Collision LayerとMask、body_entered、シグナル接続、二重取得の防止を図とコードで解説します。