バッテラが如く

プログラミングしましょ!

【Unity】任意のレイヤーに衝突したかを検知する方法

Unity (2022.1.23f1)

はじめに

GameObjectはレイヤーという情報を持っています。
衝突したオブジェクトのレイヤー値を取得するという方法を解説します。

衝突したGameObjectのレイヤーを取得

private void OnCollisionEnter(Collision collision)
{
    int layer = collision.gameObject.layer;
}

RIgidbodyをつけてるGameObjectは衝突するとOnCollisionEnterが呼ばれます。
※相手がIsTrigger(トリガー)ならOnTriggerEnterが呼ばれます。

collision.gameObject.layerで対象のレイヤーが取得できます。

これで判定したいレイヤーが取得できましたね。

layerを数値で判定する

取得したレイヤー値はint型になっています。

じゃあレイヤー値はどこで見るかですがインペクターで確認できます。

Layerのプルダウンを開くとレイヤー名の左側に書かれている数値がレイヤーの数値となります。

例えば上図のHogeだとレイヤー値が 8 ということになります。

もしHogeのレイヤーに衝突したかを判定するにはこんな感じで書きます。

int layer = collision.gameObject.layer;
if (layer == 8)
    // Hogeに衝突した!!
}

layerをレイヤー名(文字列)で判定する

前述はで判定でしていましたがレイヤー名(文字列)で判定したい場合もあるでしょう。

そういったときは、
LayerMask.NameToLayer("レイヤー名")レイヤー値からレイヤー名を取得できます

例えばHogeというレイヤー名とするなら以下のように書き方になります。

if (layer == LayerMask.NameToLayer("Hoge"))
{
    // Hogeに衝突した!!
}

LayerMask.NameToLayer存在しないレイヤー名を指定すると-1が返ります