【Unity 2D】衝突判定について

第8回目は、「衝突判定」です。 アクションゲームなどでは必ずと言ってもいいほど利用をします。今回はこの「衝突判定」についてブログに書いていきたいと思います。

前回:【Unity NGUI】フェードインとフェードアウトの実装 | albatrus.com

準備

Unityないで「衝突判定」を実装する場合、オブジェクトに以下のコンポーネントが必要となります。

  • Collider
  • RigitBody
2014-9-3-fdsada

[Collider]にはいくつか種類があるのですが、何かしら必ず必要となります。 今回は2Dなので、[Collider]も2Dのモノを利用しています。

衝突判定を実装する

ここからはスクリプトの記述となります。 Unityでは「衝突判定」を感知する便利なメソッドが複数あります。 この中から、ゲームの内容に合ったものを利用して下さい。

Triggerを利用する

[Collider]には[is Trigger]という項目があります。 これがTrue(選択)されている場合に、「衝突判定」を調べることができるのが「OnTriggerEnter2D」です。 [c]

void OnTriggerEnter2D(Collider2D collision){

    Debug.Log("hit Object");

}

[/c]

ある場面では「衝突判定」をしたくない場合があると思います。 この時に[is Trigger]を調整しましょう。

Colliderについて

衝突判定を調べるために必要なのが、[Collider]です。 [Collider]とは、どこで衝突判定を認識するかの有効範囲のことです。 Unityには複数の[Collider]が用意されています。

BoxCollider2D

四角形のColliderです。

2014-9-3-box

有効範囲は[Shift]を押しながら移動させることで変更することが可能です。

2014-9-4-fdsa

CircleCollider2D

円のColliderです。

20140904-dadsada

PolygonCollider2D

[PolygonCollider2D]は自由に有効範囲を設定できます。 これも[Shift]を使うと「頂点の作成」「頂点の移動」ができるので、好きな範囲を作成しましょう。

201409040fdsasa

OnCollisionEnter2D

先ほどの「OnTriggerEnter2D」同様に、衝突判定を調べる際に「OnCollisionEnter2D」というメソッドがあります。 [c]

void OnCollisionEnter2D(Collision2D coll) {


    Debug.Log("hit Object  COLLISION");

}

[/c]

しかし、これが思うように機能してくれません。

OnCollisionEnter2Dが働かない

衝突判定のテストでは以下の様に実験を行っていました。

2014-9-3-fdsas

コードはこのような感じです。 [c]

void Update () {

    if(isMove){


         transform.Translate(Vector2.right *0.6f *Time.deltaTime);

         /*
        Vector3 addPos = transform.position;
        addPos.x += 0.2f * Time.deltaTime;
        transform.position = addPos;
         */

         /*
        Vector3 moveRigid = new Vector3(0.1f,0.0f,0.0f);
        rigidbody2D.velocity = moveRigid * speed;



        rigidbody2D.AddForce(Vector2.right *10);
                    */
    }
}

[/c] オブジェクトの移動手段は色いろあるのですが、どれを試しても「OnCollisionEnter2D」が動いてくれません。 2つのオブジェクトには[BoxCollider2D]と[RigidBody2D]を追加しています。

OnCollisionEnter2Dが働らく場合

OnCollisionEnter2D」が働く場合があります。

2014-9-4-fdsasa

スクリプトを使わずに、重力を利用した落下には反応しました。 恐らく、スクリプトでの移動に対しては「OnCollisionEnter2D」は利用できないのかなと思っています。 もし、何か良い解決策があれば教えて欲しいです。