LoginSignup
15
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-02-22

概要

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

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

プロジェクト作成時、KinematicBody2D などのコリジョンは、すべてのオブジェクトに対して衝突を行います。
これは物理挙動としては正しいのですが、ゲームとしての衝突、特定のオブジェクトに対して衝突を除外するようなときに不便です。
例えば以下のような2Dシューティングの衝突ルールの場合……

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

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

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

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

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

レイヤーとマスクの関係

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

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

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

Shotは、Shotレイヤーに所属し、マスクはEnemyです
Godot_Engine_-_TestCollision_-_Shot_tscn.png

Enemyは、Enemyレイヤーに所属し、マスクはPlayerです
Godot_Engine_-_TestCollision_-_Enemy_tscn.png

Bulletは、Bulletレイヤーに所属し、マスクはPlayerです
Godot_Engine_-_TestCollision_-_Bullet_tscn.png

実行して動作を確認してみます。
まずは Player です。
Playerは、EnemyとBulletとのみ当たり判定を行います。
shot.gif
"Shot" とは当たり判定を行わないようになっています。

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

参考

15
6
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
15
6