さて先日と引き続きUnityちゃんゲームジャムで学んだことを復習していきます。 今回のゲームジャムにて初めて知ったのですが、1つのGameObjectには複数のColliderを設定することが出来るようです。
そのためトリガー用のColliderとコリジョン用のColliderを設定してあげることで、1つのコンポーネントでOnCollisionとOnTriggerを検知できるみたいです。
これは知らなかった。
複数のColliderを組み合わせることで、こんな素敵なコリジョンを作ることも出来ます。
もちろん処理は重くなるでしょうけど……。
さてそれでは、複数のColliderが設定されたGameObjectに対して、どのColliderが当たったかを検知出来るでしょうか?
で、出来るのかな……。
複数Colliderが設定されたGameObject(今回のサンプルではUnityちゃんのGameObject)側では、検知は難しそうですね。
OnCollisionもOnTriggerも引数は当たった相手側のCollider(Collision)のため、こちらのどのColliderが当たったかはわかりません。
では当てられる(今回のサンプルではブロックのGameObject)側では検知できるでしょうか?
複数設定されているColliderの型が別々の型ならば、as演算子を使ってColliderの種類を検知できます。
更に各Colliderの型にキャスト後に、位置や大きさなどで判定してあげれば、どのColliderに当たったかを検知できそうです。
早速コードを書いてみましょう。
void OnTriggerEnter2D( Collider2D i_other ) { BoxCollider2D boxCollider = i_other as BoxCollider2D; if( boxCollider != null ) { if( boxCollider.size.x > boxCollider.size.y ) { // 横長の四角コリジョンに当たった際の処理 } else { // 縦長の四角コリジョンに当たった際の処理 } return; } CircleCollider2D circleCollider = i_other as CircleCollider2D; if( circleCollider != null ) { if( circleCollider.center.x < 0.0f && circleCollider.center.y < 0.0f ) { // 左下の円コリジョンに当たった際の処理 } else if( circleCollider.center.x < 0.0f && circleCollider.center.y > 0.0f ) { // 左上の円コリジョンに当たった際の処理 } else if( circleCollider.center.x > 0.0f && circleCollider.center.y < 0.0f ) { // 右下の円コリジョンに当たった際の処理 } else { // 右上の円コリジョンに当たった際の処理 } return; } }
……。
やってらんねー……。
とはいえ1つのGameObjectに対して各Colliderを検知する方法は、私ではこれしか思い浮かばず……。
やはり複数のColliderの検知は難しそうです。
そもそも各Colliderの検知をしたいのなら、1つのGameObjectにColliderを集約している状況が間違いなのですよ。
Colliderとそれを検知するスクリプトを付けたGameObjectを子として持って、OnCollisionないしOnTriggerが呼ばれた際に、親に通知する処理を書く形のほうがいいような気がしますよ。
他に何か複数のColliderを検知する方法をご存知の方は、是非ご教授願いします。
これで先日分と合わせて、Unityちゃんゲームジャムにて学んだコリジョンについてでした。