第8回目は、「衝突判定」です。 アクションゲームなどでは必ずと言ってもいいほど利用をします。今回はこの「衝突判定」についてブログに書いていきたいと思います。
前回:【Unity NGUI】フェードインとフェードアウトの実装 | albatrus.com
準備
Unityないで「衝突判定」を実装する場合、オブジェクトに以下のコンポーネントが必要となります。
- Collider
- RigitBody
[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です。
有効範囲は[Shift]を押しながら移動させることで変更することが可能です。
CircleCollider2D
円のColliderです。
PolygonCollider2D
[PolygonCollider2D]は自由に有効範囲を設定できます。 これも[Shift]を使うと「頂点の作成」「頂点の移動」ができるので、好きな範囲を作成しましょう。
OnCollisionEnter2D
先ほどの「OnTriggerEnter2D」同様に、衝突判定を調べる際に「OnCollisionEnter2D」というメソッドがあります。 [c]
void OnCollisionEnter2D(Collision2D coll) {
Debug.Log("hit Object COLLISION");
}
[/c]
しかし、これが思うように機能してくれません。
OnCollisionEnter2Dが働かない
衝突判定のテストでは以下の様に実験を行っていました。
コードはこのような感じです。 [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」が働く場合があります。
スクリプトを使わずに、重力を利用した落下には反応しました。 恐らく、スクリプトでの移動に対しては「OnCollisionEnter2D」は利用できないのかなと思っています。 もし、何か良い解決策があれば教えて欲しいです。