- UnityでのCollisionモードを使った当たり判定の使い方を知りたい
その悩みを解決します。
この記事では
- Collisionモードの説明
- Collisionモードを使う条件
- Collision系のメソッドの使い方、説明
この3つを行います。
Gifを使って簡単に説明していきますので、ゆっくりご覧ください。
Collisionモードはオブジェクト同士が衝突する
Collisionモードだと物理的な当たり判定で、オブジェクト同士がぶつかり、衝突検出+衝突応答も実行されます。
衝突検出
→オブジェクトとぶつかったことを検出
衝突応答(衝突したあと)
→爆弾とプレイヤーがぶつかったことにより、衝突後に動く
です。Triggerモードみたいにオブジェクトがすり抜けませんね。
Collisionモードを使うための条件やColliderモードのときにだけ使えるメソッドがあります。
Collisionモードを使う条件
- 判定したいオブジェクトすべてにColliderコンポーネントがアタッチされている
- 判定したいオブジェクトすべてにRigidbody(またはRigidbody2D)コンポーネントがアタッチされている
- 判定したいオブジェクトすべてのColliderの【Is Trigger】がfalse(チェックなし)である
判定したいオブジェクトが上の条件を満たしていなければ、Collisionモードを使うことができません。
Rigidbodyコンポーネントといっていますが、2Dの場合でいうRigidbody2Dを表しています。
実際に使ってみる
●爆弾
アタッチされてるもの
【Circle Collider2D】
【Rigidbody 2D】
●プレイヤー(緑のやつ)
アタッチされてるもの
【Box Collider 2D】
【Rigidbody 2D】(Body type = kinematic)
【PlayerControllerスクリプト(当然名前はなんでも良き)】
●両方の【IsTrigger】にチェックがついている(なお片方でおけ)
現在このような状態です。しっかりRigidbody2Dは両方にアタッチされているし、Colliderも両方ついているし、IsTriggerにもチェックしてない状態です。
1つでもIsTriggerにチェックがついているとオブジェクトがすり抜けてしまうので、気をつけてください。
Colliderは【Box Collider】でも【Circle Collider】でもColliderとつくものであればそれで構いません。
【OnCollisionEnter2D】実際を使う
スクリプト例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnCollisionEnter2D(Collision2D collision)
{
Debug.Log("miya");
}
}
OnCollisionEnter2D | 接触したときに呼び出される |
接触したときに呼び出すことができるのが、【OnCollisionEnter2D】メソッドです。コンソールに【miya】と呼び出すようにしてます。
3Dで接触したときに呼び出したいなら【OnCollisionEnter】になります。
なんで【miya】なのって。saginomiyaのmiyaです( ・∇・)
実行例
接触した瞬間に【OnTriggerEnter2D】が呼び出されてますね。
【OnCollisionStay2D】実際を使う
スクリプト例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnCollisionStay2D(Collision2D collision)
{
Debug.Log("miya");
}
}
OnCollisionStay2D | 接触している間呼び出される |
接触している間ずっとに呼び出すことができるのが、【OnCollisionStay2D】メソッドです。コンソールに【miya】と呼び出すようにしてます。
3Dで接触したときに呼び出したいなら【OnCollisionStay】になります。
実行例
接触している間、ずっと呼び出されます。30って表記されてますね。30回も呼び出されています。
【OnCollisionExit2D】実際を使う
スクリプト例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnCollisionExit2D(Collision2D collision)
{
Debug.Log("miya");
}
}
OnCollisionExit2D | 接触して、離れた瞬間に呼び出される |
接触して離れたときに呼び出すことができるのが、【OnCollisionExit2D】メソッドです。コンソールに【miya】と呼び出すようにしてます。
3Dで接触したときに呼び出したいなら【OnCollisionExit】になります。
実行例
接触して離れたときに呼び出されます。コンソールに【miya】だらけになってしまいます。
タグでわけることもできるよ
タグとはタグの付け方についてはこちらの記事をご覧ください。このように赤い四角を用意しました。
赤い四角には【Box Collider 2D】と【Rigidbody 2D】をつけて、【Is Trigger】にはチェックをしていません。
赤い四角に【red】とタグをつける
赤い四角に【red】というタグをつけました。
スクリプト例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "red")
{
Debug.Log("miya");
}
}
}
OnCollisionEnter2D | 接触したときに呼び出される |
接触したときに呼び出すことができるのが、【OnCollisionEnter2D】メソッドです。タグ名が【red】のオブジェクトと接触したときに、コンソールに【miya】と呼び出すようにしてます。
if (引数.gameObject.tag == "red"){A}
if文を使うことでタグ名によって、処理を変更できます。
例えば【Bakudan】というタグ名がついたオブジェクトと接触したときはプレイヤーを破壊する、【Star】というタグ名がついたオブジェクトと接触したとき
実行例
爆弾がぶつかったときはなにも起こりませが、「red」タグをもつ赤い四角とぶつかったときにメソッドが実行されています。
このようにタグによって処理を変更することができます。もちろん【OnCollisionStay2D】でも【OnCollisionExit2D】でもタグによって、処理を変更できます。
Collisionモードで使えるメソッド
2Dで使えるメソッド
OnCollisionEnter2D | 接触したときに呼び出される |
OnCollisionStay2D | 接触している間呼び出される |
OnCollisionExit2D | 接触して、離れた瞬間に呼び出される |
これらです。
3Dで使えるメソッド
OnCollisionEnter | 接触したときに呼び出される |
OnCollisionStay | 接触している間、呼び出される |
OnCollisionExit | 接触して、離れた瞬間に呼び出される |
これらです。
まとめ
- Unityでの当たり判定にはCollisionモードとTriggerモード
- Collisionモードではオブジェクト同士は衝突する
- タグによって当たり判定の処理を変えられる
OnCollisionEnter2D | 接触したときに呼び出される |
OnCollisionStay2D | 接触している間呼び出される |
OnCollisionExit2D | 接触して、離れた瞬間に呼び出される |
OnCollisionEnter | 接触したときに呼び出される |
OnCollisionStay | 接触している間、呼び出される |
OnCollisionExit | 接触して、離れた瞬間に呼び出される |
まとめが多くなりました。
こちらの【Unity2D&3Dサンプルゲーム】動画よりわかりやすく記事でゲームを作ろうもご覧ください。
さぎのみや(@saginomiya8)でした。
コメント