第8回目は、「衝突判定」です。
アクションゲームなどでは必ずと言ってもいいほど利用をします。今回はこの「衝突判定」についてブログに書いていきたいと思います。
前回:【Unity NGUI】フェードインとフェードアウトの実装 | albatrus.com
準備
Unityないで「衝突判定」を実装する場合、オブジェクトに以下のコンポーネントが必要となります。- Collider
- RigitBody
[Collider]にはいくつか種類があるのですが、何かしら必ず必要となります。
今回は2Dなので、[Collider]も2Dのモノを利用しています。
衝突判定を実装する
ここからはスクリプトの記述となります。Unityでは「衝突判定」を感知する便利なメソッドが複数あります。
この中から、ゲームの内容に合ったものを利用して下さい。
Triggerを利用する
[Collider]には[is Trigger]という項目があります。これがTrue(選択)されている場合に、「衝突判定」を調べることができるのが「OnTriggerEnter2D」です。
1 2 3 4 5 |
void OnTriggerEnter2D(Collider2D collision){ Debug.Log("hit Object"); } |
ある場面では「衝突判定」をしたくない場合があると思います。
この時に[is Trigger]を調整しましょう。
Colliderについて
衝突判定を調べるために必要なのが、[Collider]です。[Collider]とは、どこで衝突判定を認識するかの有効範囲のことです。
Unityには複数の[Collider]が用意されています。
BoxCollider2D
四角形のColliderです。有効範囲は[Shift]を押しながら移動させることで変更することが可能です。
CircleCollider2D
円のColliderです。PolygonCollider2D
[PolygonCollider2D]は自由に有効範囲を設定できます。これも[Shift]を使うと「頂点の作成」「頂点の移動」ができるので、好きな範囲を作成しましょう。
OnCollisionEnter2D
先ほどの「OnTriggerEnter2D」同様に、衝突判定を調べる際に「OnCollisionEnter2D」というメソッドがあります。
1 2 3 4 5 6 |
void OnCollisionEnter2D(Collision2D coll) { Debug.Log("hit Object COLLISION"); } |
しかし、これが思うように機能してくれません。
OnCollisionEnter2Dが働かない
衝突判定のテストでは以下の様に実験を行っていました。コードはこのような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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); */ } } |
オブジェクトの移動手段は色いろあるのですが、どれを試しても「OnCollisionEnter2D」が動いてくれません。
2つのオブジェクトには[BoxCollider2D]と[RigidBody2D]を追加しています。
OnCollisionEnter2Dが働らく場合
「OnCollisionEnter2D」が働く場合があります。スクリプトを使わずに、重力を利用した落下には反応しました。
恐らく、スクリプトでの移動に対しては「OnCollisionEnter2D」は利用できないのかなと思っています。
もし、何か良い解決策があれば教えて欲しいです。
