【Godot】コリジョンレイヤーとマスクについて

この記事では、Godot Engineでの コリジョンレイヤーとマスクについて説明します。

プロジェクト作成時の挙動

プロジェクト作成時、KinematicBody2D などのコリジョンは、すべてのオブジェクトに対して衝突を行います。
これは物理挙動としては正しいのですが、ゲームとしての衝突、特定のオブジェクトに対して衝突を除外するようなときに不便です。

例えば以下のような2Dシューティングの衝突ルールの場合……

  • Playerは、Enemy(敵)とBullet(敵弾)のみ衝突を行いたい
  • Shot(自機から発射される弾)は、Enemyのみ衝突を行いたい
  • Enemyは、PlayerとShotのみ衝突を行いたい
  • Bulletは、Playerとのみ衝突を行いたい
PlayerShotEnemyBullet
Player衝突する衝突する
Shot衝突する
Enemy衝突する衝突する
Bullet衝突する

Godotでは、このように特定のオブジェクトとのみ衝突を行う仕組みとして、「コリジョンレイヤーとマスク」が用意されています。

コリジョンレイヤーの名前を設定

プロジェクト > プロジェクト設定 からプロジェクト設定を開くと、一般 > Layer Names > 2d/3d Physics からレイヤー名を設定できます。(2d/3d Renderは描画用のレイヤーでコリジョンとは別ものとなることに注意!)
今回は2Dで判定を行いたいので、以下のように設定しました。

この設定をすることで、各オブジェクトの PhysicsBody2D > Collision から「コリジョンレイヤーとマスク」をわかりやすく名前で管理することができます。

レイヤーとマスクの関係

レイヤーとマスクの関係は以下のとおりです。

  • レイヤー:自分が所属しているコリジョン
  • マスク:自分が当たり判定を行うコリジョン

例えば Player は Playerレイヤーに所属し、マスク(衝突対象)は Enemy/Bullet となります

Shotは、Shotレイヤーに所属し、マスクはEnemyです

Enemyは、Enemyレイヤーに所属し、マスクはPlayerです

Bulletは、Bulletレイヤーに所属し、マスクはPlayerです

実行して動作を確認してみます。

まずは Player です。
Playerは、EnemyとBulletとのみ当たり判定を行います。

“Shot” とは当たり判定を行わないようになっています。

Shotの当たり判定を見てみます。

Shotは Enemyとのみ当たり判定を行うので、それ以外とは衝突しなくなっています。同じレイヤーである Shot とも衝突しなくなっています。

参考