【Unity】複数のColliderを結合するComposite Collider 2Dを使って少し遊ぶ
今回はUnity 5.6に追加されたComposite Collider 2Dについてです。
Compound Collidersという機能
Rigidbodyの下にColliderが複数ある時、実はUnityはColliderを一つにまとめて処理してくれます。これで動かす場合、MeshColliderよりも高速で動作します。
こういったCompound(複合)コライダーはMeshColliderやPolygonColliderより大体高速で動作し、かつMeshCollider系の制約も殆ど受けないので色々と便利です。
例えば、下にMeshColliderとComposite Colliderで作成したモデルを用意してみます。
当たり判定は大体同じように作れますが、MeshColliderはCompositeColliderと比較して、単純に当たり判定の計算負荷が高く、アニメーションに非対応で*1、かつMeshCollider同士の当たり判定が出来ない問題があります。
そのため、単純な形状のコライダーを動かして当たり判定を作るCompoundColliderという機能があります。
ちなみに、CompoundColliderはAColliderBuilderでサクっと作れます。
https://www.assetstore.unity3d.com/jp/#!/content/15058
CompositeCollider2Dという機能
さて、5.6でCompoundColliderに微妙に似てますが異なる機能が追加されました。CompositeColliderなるコンポーネントです。
これは複数のCollider2D(MeshColliderとBoxColliderのような頂点ベースのコライダー)を結合し、一つのコライダーに変換する機能みたいです。
例えば下のように、複数のBoxColliderが同じ範囲に入ると、一つのColliderのように結合されているのが分かります。
Colliderの結合は、同期(動かした時に計算?)、非同期、スクリプトからのアクセスの3タイプがあります。要するに、このメッシュ結合はランタイムで動きます。
ちなみに結合コストは結構高いのか、弾幕を作り「一つのRigidbody + 一つのComposite Collider(内部に500個程のCollider)」をやってみた所、バラバラに動かしたほうが早かったです。
また、Geometry typeをOutlineに設定すると、コライダーの形状に沿ってコライダーを作成するみたいです。
ダイナミック洞窟生成
この機能で思いついたのが、ダイナミック洞窟生成です。
やってる事は物凄い単純で、Geometry TypeをOutlineに設定し、あとはモノをどんどん増やしていくだけです。
下のようになります。
Unity 5.6のCompositeCollider2Dでダイナミック洞窟生成 pic.twitter.com/jN2vAuA98V
— 椿 (@tsubaki_t1) 2017年2月21日
Unity 5.6のCompositeCollider2Dのダイナミック洞窟その2。生成する穴を斜めにしたり、唐突に下に穴を空けてみたり pic.twitter.com/8DT3AjI6VJ
— 椿 (@tsubaki_t1) 2017年2月21日
作り方
- 結合するCollider2Dの付いたGameObjectを用意する
- CompositeCollider2Dの付いたGameObjectを用意する
- 1を2の子オブジェクトとして配置
- 1のColliderのUse By Compositeにチェックを入れる
後はEdge Radiusの値を調整します。小さすぎると当たり判定が貫通する事がありますし、大きすぎると凄い浮きます。
後はComposite ColliderにはRigidbodyが付いてくるので、BodyTypeをStaticもしくはkinematicに設定しておきます。
なんか、コレだけで何かゲームを作れそうな気がしなくもないですね。穴掘りゲーム的な。
関連
*1:メッシュを作成しMeshBake等でメッシュ情報を更新しなければ当たり判定が付いてこない