0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unity ECS CollisionFilterの取り扱いについて

Last updated at Posted at 2024-09-07

UnityESCは、CollisionFilterの説明が不足している

ECSを使ってゲーム作りしていると、CollisionFilterを使いたい場面は多いと思います。
しかしながら、Unity公式にアクセスしても情報が足りない!
ググっても全然情報が無い!
英語の記事すらも全然見つからない...!

という訳なので、記事に残そうと思います。
MonoBehaviorとはかなり違い、ややこしいです。効率的な計算の代償として、人間が扱いずらい設定方法になっているのでしょう。

まずInspectorでの設定ですが、これはMonoBehaviorとそこまで変わりません。
以下のように、Physics Shape内のColllision Filter内で、Belongs ToやCollides Withを設定すればOKです。
image.png

次に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にゲーム作成経過を記録しているので、是非フォローしてください。

以上

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?