テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】複数のColliderを結合するComposite Collider 2Dを使って少し遊ぶ

今回はUnity 5.6に追加されたComposite Collider 2Dについてです。

Compound Collidersという機能

Rigidbodyの下にColliderが複数ある時、実はUnityはColliderを一つにまとめて処理してくれます。これで動かす場合、MeshColliderよりも高速で動作します。

f:id:tsubaki_t1:20170222002439g:plain

こういったCompound(複合)コライダーはMeshColliderやPolygonColliderより大体高速で動作し、かつMeshCollider系の制約も殆ど受けないので色々と便利です。

 

例えば、下にMeshColliderとComposite Colliderで作成したモデルを用意してみます。

当たり判定は大体同じように作れますが、MeshColliderはCompositeColliderと比較して、単純に当たり判定の計算負荷が高くアニメーションに非対応*1、かつMeshCollider同士の当たり判定が出来ない問題があります。

そのため、単純な形状のコライダーを動かして当たり判定を作るCompoundColliderという機能があります。

f:id:tsubaki_t1:20170222221956j:plain

ちなみに、CompoundColliderはAColliderBuilderでサクっと作れます。

f:id:tsubaki_t1:20170222225404j:plain

https://www.assetstore.unity3d.com/jp/#!/content/15058

CompositeCollider2Dという機能

さて、5.6でCompoundColliderに微妙に似てますが異なる機能が追加されました。CompositeColliderなるコンポーネントです。

これは複数のCollider2D(MeshColliderとBoxColliderのような頂点ベースのコライダー)を結合し、一つのコライダーに変換する機能みたいです。

 

例えば下のように、複数のBoxColliderが同じ範囲に入ると、一つのColliderのように結合されているのが分かります。

f:id:tsubaki_t1:20170222222833g:plain

Colliderの結合は、同期(動かした時に計算?)、非同期、スクリプトからのアクセスの3タイプがあります。要するに、このメッシュ結合はランタイムで動きます。

f:id:tsubaki_t1:20170222223254j:plain

ちなみに結合コストは結構高いのか、弾幕を作り「一つのRigidbody + 一つのComposite Collider(内部に500個程のCollider)」をやってみた所、バラバラに動かしたほうが早かったです。

また、Geometry typeをOutlineに設定すると、コライダーの形状に沿ってコライダーを作成するみたいです。

f:id:tsubaki_t1:20170222223754j:plain

ダイナミック洞窟生成

この機能で思いついたのが、ダイナミック洞窟生成です。

やってる事は物凄い単純で、Geometry TypeをOutlineに設定し、あとはモノをどんどん増やしていくだけです。

下のようになります。

作り方

  1. 結合するCollider2Dの付いたGameObjectを用意する
  2. CompositeCollider2Dの付いたGameObjectを用意する
  3. 1を2の子オブジェクトとして配置
  4. 1のColliderのUse By Compositeにチェックを入れる

f:id:tsubaki_t1:20170222224642g:plain

 

後はEdge Radiusの値を調整します。小さすぎると当たり判定が貫通する事がありますし、大きすぎると凄い浮きます。

f:id:tsubaki_t1:20170222225021j:plain

後はComposite ColliderにはRigidbodyが付いてくるので、BodyTypeをStaticもしくはkinematicに設定しておきます。

f:id:tsubaki_t1:20170222225605j:plain

なんか、コレだけで何かゲームを作れそうな気がしなくもないですね。穴掘りゲーム的な。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

*1:メッシュを作成しMeshBake等でメッシュ情報を更新しなければ当たり判定が付いてこない