うら干物書き

ゲームを作っています。

Unityちゃんゲームジャムの復習 その二

 さて先日と引き続きUnityちゃんゲームジャムで学んだことを復習していきます。    今回のゲームジャムにて初めて知ったのですが、1つのGameObjectには複数のColliderを設定することが出来るようです。


 そのためトリガー用のColliderとコリジョン用のColliderを設定してあげることで、1つのコンポーネントでOnCollisionとOnTriggerを検知できるみたいです。

 これは知らなかった。

f:id:urahimono:20160718213949p:plain

 複数のColliderを組み合わせることで、こんな素敵なコリジョンを作ることも出来ます。

f:id:urahimono:20160718213951p:plain

 もちろん処理は重くなるでしょうけど……。

 さてそれでは、複数の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が呼ばれた際に、親に通知する処理を書く形のほうがいいような気がしますよ。

f:id:urahimono:20160718213953p:plain

 他に何か複数のColliderを検知する方法をご存知の方は、是非ご教授願いします。    

 これで先日分と合わせて、Unityちゃんゲームジャムにて学んだコリジョンについてでした。