【Godot】グループによる柔軟なオブジェクト判定

作成: 2025-06-20最終更新: 2025-12-06

ノードにタグを付けて種類を識別する仕組み。敵の判定や相互作用可能なオブジェクトの管理に活用

概要

ゲームが複雑になるにつれて、「すべての敵に同じ命令を送りたい」「プレイヤーの攻撃が当たったのが『アイテム』グループのオブジェクトか判定したい」といった、特定の種類のオブジェクトをまとめて扱いたい場面が増えてきます。

このような要求にエレガントに応えるのが、Godotのグループ (Groups) 機能です。グループは、ノードに「敵」「アイテム」「破壊可能オブジェクト」といったタグを付け、後からそのタグを使ってノードを検索したり、一括で操作したりするための非常に便利な仕組みです。

この記事では、Godotのグループ機能の基本的な使い方と、それがもたらす柔軟なオブジェクト管理の方法について解説します。

グループとは?

グループは、シーンツリーの階層とは無関係に、ノードを仮想的な集まりに分類するためのタグ付けシステムです。一つのノードは複数のグループに所属できますし、グループはプロジェクト全体で共有されます。

グループの主なメリット:

  • 柔軟な分類: ノードの種類(CharacterBody2DArea2Dなど)や親子関係に縛られずに、オブジェクトを自由に分類できます。
  • 一括操作: 特定のグループに属するすべてのノードを取得し、同じメソッドを呼び出すといった処理が簡単に書けます。
  • 疎結合: ノード同士が直接お互いを知らなくても、グループを通じて間接的に連携できます。これにより、コードの見通しが良くなります。

グループの設定方法

ノードをグループに追加する方法は、エディタから行う方法とコードから行う方法の2つがあります。

1. エディタで設定する

最も簡単で一般的な方法です。

  1. シーンツリーでグループに追加したいノードを選択します。
  2. インスペクタの隣にある「ノード」タブを開きます。
  3. 「グループ」タブを選択します。
  4. テキストボックスにグループ名(例: enemies)を入力し、「追加」ボタンを押します。
グループ設定画面

これで、選択したノードはenemiesグループの一員となりました。

2. コードで設定する

動的に生成したノードをグループに追加したい場合などに使います。

func _ready():
    # このノードを"bullets"グループに追加する
    add_to_group("bullets")

# グループから削除することも可能
func _on_hit_target():
    remove_from_group("bullets")

グループの活用例

グループの真価は、それをスクリプトからどう利用するかにあります。

活用例1: 特定のグループに属するノードを取得する

SceneTreeオブジェクト(get_tree()で取得)には、グループを操作するための便利なメソッドが用意されています。

# シーン内にいる全ての"enemies"グループのノードを取得
func _ready():
    var all_enemies = get_tree().get_nodes_in_group("enemies")
    for enemy in all_enemies:
        print(enemy.name)

活用例2: グループ内の全ノードに一斉に命令する(ブロードキャスト)

SceneTreecall_group()メソッドを使えば、特定のグループに属する全ノードの特定の関数を一括で呼び出すことができます。例えば、ボスが登場したときに、すべての敵キャラクターを一時停止させる、といった演出が可能です。

# Boss.gd
func _on_boss_appeared():
    # "enemies"グループに属する全てのノードの"pause_movement"メソッドを呼び出す
    get_tree().call_group("enemies", "pause_movement")

# Enemy.gd
func pause_movement():
    # 動きを止める処理
    set_physics_process(false)

活用例3: 衝突判定での利用

Area2Dbody_enteredシグナルなどと組み合わせることで、衝突した相手が特定のグループに属しているかを簡単に判定できます。

# Player.gd
func _on_body_entered(body):
    # 衝突した相手が"enemies"グループにいるかチェック
    if body.is_in_group("enemies"):
        take_damage()

    # 衝突した相手が"items"グループにいるかチェック
    if body.is_in_group("items"):
        body.collect() # アイテム側の収集処理を呼び出す

これにより、if body.name == "Slime" or body.name == "Goblin" ... のような、拡張性の低いコードを書かずに済みます。

まとめ

グループ機能は、Godotで整理された、拡張しやすいコードを書くための強力な武器です。オブジェクトにタグを付け、そのタグを使ってオブジェクトを検索・操作するというシンプルな概念ですが、その応用範囲は非常に広いです。

  • アイテム などの役割で分類する。
  • 一括操作 したいオブジェクトをまとめる。
  • 衝突判定 で相手の種類を特定する。

これらの場面に出会ったら、ぜひグループ機能の活用を検討してみてください。あなたのプロジェクトは、よりクリーンで管理しやすいものになるはずです。