徳島ゲーム開発ごっこ 技術ブログ

ゲームを作るために役に立ったり立たなかったりする技術を学んでいきます!

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ちゃんゲームジャムにて学んだコリジョンについてでした。