0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

本記事の経緯

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

1.レイヤーIDを使用する場合

int型
InsperctorウインドウのLayer番号がレイヤーIDに当たります。
スクリーンショット 2025-02-24 10.32.07.png

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

基本的にオブジェクトを取得する方法には用いられず、「レイヤー間の衝突判定のOnOff」に用いられる場合が多いようです。
使用するメソッドの例としては以下のようなものが挙げられます。

Physics2D.IgnoreLayerCollision Physics2D.IgnoreLayerCollision(公式ドキュメント)

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

例: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

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

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

スクリーンショット 2025-02-24 11.56.33.png

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

2.LayerMaskを使用する場合

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

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");

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

Physics2D関連 Physics2D(公式ドキュメント)

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

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 :始点と終点を設定して点間で衝突する最初のオブジェクトを検出

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

最後に

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

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?