【Unity2D 初心者向け】レイヤーを参照する方法 -レイヤーIDとLayerMask-

# 本記事の経緯
オブジェクトを取得する方法の一つに、レイヤーを用いる方法があります。
例えば、接地判定を足元と地面と接触しているかを判定する場合にレイヤーを用いて判定することができます。
今回、レイヤーを指定しているのに判定されない！という事象が発生し、その解決の際にレイヤーを参照する方法が二種類あることを知り、それについて調べたことを記事としてまとめさせていただきます。
同じ現象で困ってる方の手助けなどに役立てば幸いです。

# 1.レイヤーIDを使用する場合
int型
InsperctorウインドウのLayer番号がレイヤーIDに当たります。
![スクリーンショット 2025-02-24 10.32.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992369/056367ca-ff9a-43fc-8e02-8710affbc349.png)

画像の場合にPlayerを指定したい場合、その値は8となります。

基本的にオブジェクトを取得する方法には用いられず、「レイヤー間の衝突判定のOnOff」に用いられる場合が多いようです。
使用するメソッドの例としては以下のようなものが挙げられます。
<details><summary>Physics2D.IgnoreLayerCollision</summary>
<a href=https://docs.unity3d.com/ScriptReference/Physics2D.IgnoreLayerCollision.html>Physics2D.IgnoreLayerCollision(公式ドキュメント)</a>

二つのレイヤー間の判定を無効にします。

```: 例:PlayerとEnemyの判定を無効にする
Physics2D.IgnoreLayerCollision(8,12,true);

Physics2D.IgnoreLayerCollision(8,12,false); // 第三引数をfalseにすると有効にすることもできます
```

常に無効にする場合は Edit>Project Settings の Physics2DのLayer Collison Matrixで無効にしたいレイヤー間のチェックを外すことで同様の設定が可能です。

![スクリーンショット 2025-02-24 10.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992369/16414fd8-4899-4fe4-9489-6b428b17354d.png)

</details>

<details><summary>Rigidbody2D.include(exclude)layer</summary>
物理判定を含ませる(あるいは、除外させる)レイヤーの一覧

設定自体はInspectorウインドウ内でRigidbody 2D>Layer Overrides から

![スクリーンショット 2025-02-24 11.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992369/c6d9ee24-3a4e-423a-8345-008e09a5c962.png)

Phsics2Dの設定のオブジェクトごと版？みたいな扱いだと思われる
(これに限った話ではないがCollider2D関連のコンポーネントとは連携しているのでどっちか設定すれば大丈夫なはず)
Phsics2Dで十分な限りはNoneに設定するのがアンパイだと思われる

</details>


## 2.LayerMaskを使用する場合
int型
2^[レイヤー番号]がそれに当たります。
引用元 公式ドキュメントLayerMask.GetMaskの注釈より
https://docs.unity3d.com/ScriptReference/LayerMask.GetMask.html

:::note warn
Note: Suppose UserLayerA and UserLayerB are the tenth and eleventh layers. These will have a User Layer values of 10 and 11. To obtain their layer mask value their names can be passed into GetMask. The argument can either be a list of their names or an array of strings storing their names. In this case the return value will be 2^10 + 2^11 = 3072.
:::

複数レイヤーを指定する際はその和を指定すれば良い様子
そして複数レイヤー指定可能にする都合レイヤーIDを指定するよりちょっとややこくなってる模様？
```: LayerMaskを取得
int playerLayerMask = LayerMask.GetMask("Player");

// 複数取得することも可能
int activeLayerMask= LayerMask.GetMask("Player","Enemy");
```

使用するメソッドとしては以下のようなものがあげられます。

<details><summary>Physics2D関連</summary>
<a href=https://docs.unity3d.com/ScriptReference/Physics2D.html>Physics2D(公式ドキュメント)</a>

指定した範囲/一直線上に一致するレイヤーのオブジェクトがあるか調べる
軽く説明

OverlapArea :2点を対角線とする四角内のオブジェクトを検出(複数ある場合Z座標が最も小さいもののみ返す)
```: 例:足元の判定を行う場合
        platFormLayer = LayerMask.GetMask("PlatForm");
        Vector2 footStartPosition = new Vector2(transform.position.x - 0.55f, transform.position.y - 0.9f);
        Vector2 footEndPosition = new Vector2(transform.position.x + 0.4f, transform.position.y - 1.05f);
        
        Collider2D hitPlatForm = Physics2D.OverlapArea(footStartPosition, footEndPosition, platFormLayer);
```

OverlapAreaAll: 上記の全部返すバージョン(返り値は配列型になる) 
Raycast :始点と終点を設定して点間で衝突する最初のオブジェクトを検出

他にも円形や四角、点なども指定可能

</details>

# 最後に
レイヤーを用いるとある括りでの判定が容易になるため、うまく活用できると非常に便利だなーと思いました。
また、活用を行う上でレイヤーの参照・指定の方法を理解することは非常に有用だと思います。この記事を読んで頂いて、その理解を深めるお役に立てていれば幸いです。