UnityESCは、CollisionFilterの説明が不足している
ECSを使ってゲーム作りしていると、CollisionFilterを使いたい場面は多いと思います。
しかしながら、Unity公式にアクセスしても情報が足りない!
ググっても全然情報が無い!
英語の記事すらも全然見つからない...!
という訳なので、記事に残そうと思います。
MonoBehaviorとはかなり違い、ややこしいです。効率的な計算の代償として、人間が扱いずらい設定方法になっているのでしょう。
まずInspectorでの設定ですが、これはMonoBehaviorとそこまで変わりません。
以下のように、Physics Shape内のColllision Filter内で、Belongs ToやCollides Withを設定すればOKです。
次にScript側での設定。MonoBehaviorでいうところのOntriggerEnter的な機能とか、Raycastを使いたい場合は、Script上で設定する必要があります。
例えばレイヤー2.3.4と接触させたい場合は、以下のようにします。
uint collidesWithLayers = (1u << 2) | (1u << 3) | (1u << 4);
こんな分かりずらい記述をする理由ですが、
まず1u
の意味は、
1u = 00000000 00000000 00000000 00000001 (二進数)
です。
<< 2
すると、2ビット左に移動するので、
1u << 2 = 00000000 00000000 00000000 00000100
となります。
※つまり、 1u << 2 の結果は 4です。
そもそもレイヤーは以下のように定義されています。
1u << 0 は 00000000 00000000 00000000 00000001
なので「Layer 0」を意味します。
1u << 1 は 00000000 00000000 00000000 00000010
なので「Layer 1」を意味します。
1u << 2 は 00000000 00000000 00000000 00000100
なので「Layer 2」を意味します。
例えば以下のようなスクリプトです。
RaycastInput raycastInput = new RaycastInput
{
Start = ray.origin,
End = ray.origin + ray.direction * 1000f,
Filter = new CollisionFilter
{
BelongsTo = ~0u, //全レイヤーと接触する
CollidesWith = (1u << 0) | (1u << 2) //レイヤー0,2と接触する
}
};
以下動画では、Entityに対してマウスからRayを発射し、当たり判定を元にStatusWindowを表示したり消したりしています。Colllision Filterの設定により、キャラクター以外にマウスポイントのRayが当たっても反応しません。
Twitterにゲーム作成経過を記録しているので、是非フォローしてください。
以上