六畳の享楽

アニメ・ゲームの感想を書いたりするつもりです

PlatformEffector2DのUse One Way Groupingオプションの使い道

現在、Unityで2Dゲーム制作中です。

下から通り抜けられる床*1を実装する方法を調べていて、その中でわかったことがあったのでメモしておきます。誰かの役に立てば。

下から通り抜けられる床を実装する、恐らく一番簡単な方法はPlatformEffector2Dというコンポーネントを使用すること。それをアタッチし、Use One Wayオプションを有効にするだけで衝突判定が特定の方向からのみ有効になります。コンポーネントの使い方は以下の記事が具体的でイメージがつきやすいと思います。

kan-kikuchi.hatenablog.com

ただ、その記事中でも機能がいまいちはっきりしていないオプションがありました。Use One Way Groupingです。制作中のゲームの仕様を満たすには、このオプションが鍵になりました。

ここで、図のように複数のコライダから構成されるカプセル形状を考えます。Use One Wayオプションを有効にしたコライダに対しては、下からは通り抜けられて、上からは着地するような振る舞いが期待されます。そして大体の場面では期待通り振る舞います。

f:id:katopan:20160501172609p:plain

しかし、これだけでは不十分です。図のようにカプセル形状を構成する一部のコライダのみ通り抜け、残りのコライダは通り抜けられなかった場合を考えます。その場合、通り抜けることができたコライダに関しては衝突判定が有効になってしまい、図のようにカプセル形状の途中で着地してしまいます。

これを回避できるのが、Use One Way Groupingオプションです。このオプションを有効にすると、同一のオブジェクトにアタッチされたコライダが、Use One Wayオプションを有効にしたコライダに対して衝突判定が有効かどうかのフラグを共有するようになります。先ほどの例だと、一部のコライダは通り抜けきっておらず衝突判定が無効のため、カプセル形状全体としても衝突判定が無効になります。わーい。

余談ですが、カプセル形状についてはUnityの中の人がCapsuleCollider2Dを作っているという話(動画参照)があるようです。3DではCapsuleColliderが用意されているのに、2Dには相当するものがないというのも妙な話なので、まあそうだよなあという感じですが。早々にCapsuleCollider2Dが実装されて、楽々2Dゲーム開発ができるようになると嬉しいなと思います。


docs.unity3d.com

*1:長い。どなたか別名知りませんか。