本記事の経緯
オブジェクトを取得する方法の一つに、レイヤーを用いる方法があります。
例えば、接地判定を足元と地面と接触しているかを判定する場合にレイヤーを用いて判定することができます。
今回、レイヤーを指定しているのに判定されない!という事象が発生し、その解決の際にレイヤーを参照する方法が二種類あることを知り、それについて調べたことを記事としてまとめさせていただきます。
同じ現象で困ってる方の手助けなどに役立てば幸いです。
1.レイヤーIDを使用する場合
int型
InsperctorウインドウのLayer番号がレイヤーIDに当たります。
画像の場合にPlayerを指定したい場合、その値は8となります。
基本的にオブジェクトを取得する方法には用いられず、「レイヤー間の衝突判定のOnOff」に用いられる場合が多いようです。
使用するメソッドの例としては以下のようなものが挙げられます。
Physics2D.IgnoreLayerCollision
Physics2D.IgnoreLayerCollision(公式ドキュメント)二つのレイヤー間の判定を無効にします。
Physics2D.IgnoreLayerCollision(8,12,true);
Physics2D.IgnoreLayerCollision(8,12,false); // 第三引数をfalseにすると有効にすることもできます
常に無効にする場合は Edit>Project Settings の Physics2DのLayer Collison Matrixで無効にしたいレイヤー間のチェックを外すことで同様の設定が可能です。
Rigidbody2D.include(exclude)layer
物理判定を含ませる(あるいは、除外させる)レイヤーの一覧設定自体はInspectorウインドウ内でRigidbody 2D>Layer Overrides から
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を指定するよりちょっとややこくなってる模様?
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 :始点と終点を設定して点間で衝突する最初のオブジェクトを検出
他にも円形や四角、点なども指定可能
最後に
レイヤーを用いるとある括りでの判定が容易になるため、うまく活用できると非常に便利だなーと思いました。
また、活用を行う上でレイヤーの参照・指定の方法を理解することは非常に有用だと思います。この記事を読んで頂いて、その理解を深めるお役に立てていれば幸いです。