バッテラが如く

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

【Unity】衝突したGameObjectのレイヤーで判定する方法

GameObjectはレイヤー(layer)を持っています。
衝突したオブジェクトをレイヤー値で処理の分岐を作りたい時がありませんか?

今回はレイヤーを使った判定方法を共有したいと思います。

■開発環境

  • MacOS Monterey (12.1) Unity (2021.3.2f1)
  • 衝突したGameObjectのlayer(レイヤー)を取得

    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("レイヤー名") でレイヤー値からレイヤー名を取得します。

    これでレイヤー値を取得して前述の方法で判定すればできます。

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

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