【Godot】Collision LayersとMasksによる衝突判定の整理

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

レイヤーとマスクを使って衝突判定を効率的に管理する方法。プレイヤー、敵、武器の判定を適切に分離

概要

Godotでゲーム開発をしていると、「プレイヤーは壁を通り抜けられないようにしたい」「敵は敵同士で衝突させたくない」「コインはプレイヤーだけが取得できるようにしたい」といった、複雑な衝突のルールを決めたくなります。これらをif文だけで管理しようとすると、コードはあっという間に複雑怪奇になってしまいます。

この問題をエレガントに解決するのが、Godotの物理エンジンに組み込まれているCollision Layers(衝突レイヤー)Collision Masks(衝突マスク) です。

この記事では、多くの初心者がつまずきがちなこの2つの概念を、図解と共に分かりやすく解説し、あなたのゲームの衝突判定を整理整頓します。

LayersとMasks:役割分担の概念

CollisionObjectArea2D, CharacterBody2D, RigidBody2Dなど)のインスペクタを見ると、CollisionセクションにLayerMaskという項目があります。この2つは、それぞれ明確な役割を持っています。

  • Layer(レイヤー): 「私はここにいます」 という宣言。オブジェクトがどの物理レイヤーに存在するかを示します。
  • Mask(マスク): 「私はこれと衝突したい」 という宣言。オブジェクトがどのレイヤーに存在するオブジェクトを検出対象とするかを示します。

覚え方: レイヤーは「自分の名札」、マスクは「探している相手の名札」と考えると分かりやすいです。

衝突が発生するためには、お互いのLayerとMaskが噛み合う 必要があります。つまり、オブジェクトAがオブジェクトBと衝突するためには、以下の両方の条件を満たす必要があります。

  1. オブジェクトAのMask が、オブジェクトBのLayer をチェックしている。
  2. オブジェクトBのMask が、オブジェクトAのLayer をチェックしている。

設定方法と名前付け

LayerとMaskは、それぞれ32個のON/OFF可能なチェックボックスとして表現されます。しかし、ただ「1番」「2番」と覚えておくのは大変です。

そこで、プロジェクト設定で各レイヤーに名前を付ける ことが非常に重要です。

  1. 「プロジェクト」→「プロジェクト設定」を開きます。
  2. 左のツリーから「レイヤー名」→「2D物理」または「3D物理」を選択します。
  3. 各レイヤーに「player」「enemy」「world」「item」といった分かりやすい名前を付けます。
Collision Layer名前設定

こうすることで、インスペクタのチェックボックスに名前が表示され、設定ミスを劇的に減らすことができます。

実践例:具体的な設定

よくあるゲームの登場オブジェクトを例に、具体的な設定を見てみましょう。

オブジェクトLayer (私はここにいる)Mask (これと衝突したい)
Playerplayerworld, enemy, item
Enemyenemyworld, player
World (壁/床)worldplayer, enemy
Item (コイン)itemplayer

この設定により、以下のような挙動が実現されます。

  • Player: 壁や敵、アイテムと衝突します。
  • Enemy: 壁やプレイヤーと衝突しますが、敵同士やアイテムとは衝突(すり抜け)しません。
  • World: プレイヤーや敵とは衝突しますが、アイテムとは衝突しません(アイテムが壁に埋まらないようにするため)。
  • Item: プレイヤーとのみ衝突(取得判定)します。壁や敵はすり抜けます。

Area2Dを使えば、衝突はせず「侵入したこと」だけを検出することも可能です。例えば、敵の攻撃範囲をArea2Dで作り、Maskplayerレイヤーのみを監視する、といった使い方ができます。

まとめ

Collision LayersとMasksは、一見すると複雑に思えるかもしれませんが、その役割分担(「私はここ」と「あなたを探している」)を一度理解してしまえば、非常に強力なツールとなります。

この機能を使いこなすことで、move_and_slide()内の衝突処理コードをシンプルに保ち、オブジェクト間のインタラクションを宣言的に、かつ直感的に管理できるようになります。ゲームの規模が大きくなるほど、その恩恵は計り知れません。

まずはプロジェクト設定でレイヤーに名前を付けることから始めて、衝突判定の整理整頓に挑戦してみてください。