- UnityでのTrigger(トリガー)を使った当たり判定の使い方を知りたい
その悩みを解決します。
この記事では
- Triggerモードの説明
- Triggerモードを使う条件
- Trigger系のメソッドの使い方、説明
この3つを行います。
Gifを使って簡単に説明していきますので、ゆっくりご覧ください。
Triggerモードはオブジェクト同士がすり抜ける
オブジェクト同士が衝突したことは検出します。ただオブジェクト同士はすり抜けるので、ぶつかりません。
ただ衝突したことを検出するだけです。2Dでも3Dでも同じです。ただすり抜けていきます。
Triggerモードを使う条件
- 判定したいオブジェクトすべてにColliderコンポーネントがアタッチされている
- 判定したいオブジェクトの最低限一方にRigidbody(またはRigidbody2D)コンポーネントがアタッチされている
- 判定したいオブジェクトの最低限一方のColliderの【Is Trigger】がtrue(チェックあり)である
そんな衝突の検知しか行わないTriggerモードですが、使う条件があります。上の条件を満たさないと使うことができません。この条件を満たさないとTrigger系のメソッドを使うことができないです。
【Is Trigger】は片方で良いですよ。こんな【Unity】Is Triggerのチェックは両方につけるべきなの?いいえ片方でも結構です(Triggerモード)実験もしました。
では実際に使っていきます。
Triggerモードを実際に使ってみる
●爆弾
アタッチされてるもの
【Circle Collider2D】
【Rigidbody 2D】
●プレイヤー(緑のやつ)
アタッチされてるもの
【Box Collider 2D】
【PlayerControllerスクリプト(当然名前はなんでも良き)】
●両方の【IsTrigger】にチェックがついている(なお片方でおけ)
現在このような状態です。しっかりRigidbody2Dは1つはアタッチされているし、Colliderも両方ついているし、IsTriggerにもチェックしてある状態です。
Colliderは【Box Collider】でも【Circle Collider】でもColliderとつくものであればそれで構いません。
【OnTriggerEnter2D】実際を使う
スクリプト例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log("miya");
}
}
OnTriggerEnter2D | トリガーに接触したときに呼び出される |
接触したときに呼び出すことができるのが、【OnTriggerEnter2D】メソッドです。コンソールに【miya】と呼び出すようにしてます。
3Dで接触したときに呼び出したいなら【OnTriggerEnter】になります。
なんで【miya】なのって。saginomiyaのmiyaです( ・∇・)
実行例
接触した瞬間に【OnTriggerEnter2D】が呼び出されてますね。
【OnTriggerStay2D】実際を使う
スクリプト例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnTriggerStay2D(Collider2D collision)
{
Debug.Log("miya");
}
}
OnTriggerStay2D | トリガーに接触している間呼び出される |
接触しているときに呼び出すことができるのが、【OnTriggerStay2D】メソッドです。コンソールに【miya】と呼び出すようにしてます。
3Dで接触したときに呼び出したいなら【OnTriggerStay】になります。
実行例
接触している間、ずっと呼び出されます。コンソールに【miya】だらけになってしまいます。
【OnTriggerExit2D】実際を使う
スクリプト例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnTriggerExit2D(Collider2D collision)
{
Debug.Log("miya");
}
}
OnTriggerExit2D | トリガーに接触して、離れた瞬間に呼び出される |
接触して離れたときに呼び出すことができるのが、【OnTriggerExit2D】メソッドです。コンソールに【miya】と呼び出すようにしてます。
3Dで接触したときに呼び出したいなら【OnTriggerExit2D】になります。
実行例
接触して離れたときに呼び出されます。コンソールに【miya】だらけになってしまいます。
タグでわけることもできるよ
タグとはタグの付け方についてはこちらの記事をご覧ください。このように赤い四角を用意しました。
赤い四角には【Box Collider 2D】と【Rigidbody 2D】をつけて、【Is Trigger】にもチェックをしています。
赤い四角に【red】とタグをつける
赤い四角に【red】というタグをつけました。
スクリプト例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "red")
{
Debug.Log("miya");
}
}
}
OnTriggerEnter2D | トリガーに接触したときに呼び出される |
接触したときに呼び出すことができるのが、【OnTriggerEnter2D】メソッドです。タグ名が【red】のオブジェクトと接触したときに、コンソールに【miya】と呼び出すようにしてます。
if (引数.gameObject.tag == "red"){A}
if文を使うことでタグ名によって、処理を変更できます。
例えば【Bakudan】というタグ名がついたオブジェクトと接触したときはプレイヤーを破壊する、【Star】というタグ名がついたオブジェクトと接触したときHPを上げるなど処理を変更できます。
実行例
爆弾がぶつかったときはなにも起こりませが、「red」タグをもつ赤い四角とぶつかったときにメソッドが実行されています。
このようにタグによって処理を変更することができます。
Triggerモードで使えるメソッド
2Dで使えるメソッド
OnTriggerEnter2D | トリガーに接触したときに呼び出される |
OnTriggerStay2D | トリガーに接触している間呼び出される |
OnTriggerExit2D | トリガーに接触して、離れた瞬間に呼び出される |
これらです。
まあトリガーっていってますけど、オブジェクト同士が接触したときって発想で良いです。厳密には違いますが、わかりやすい方が良いもんね。
3Dで使えるメソッド
OnTriggerEnter | トリガーに接触したときに呼び出される |
OnTriggerStay | トリガーに接触している間、呼び出される |
OnTriggerExit | トリガーに接触して、離れた瞬間に呼び出される |
これらです。2Dでも3Dでもメソッド名が少し違うだけでほかはなにも変わりません。衝突したことを検知しますが、実際には当たらないですり抜けます。
まとめ
- Unityでの当たり判定にはCollisionモードとTriggerモード
- Triggerモードではオブジェクト同士はすり抜ける
- タグによって当たり判定の処理を変えられる
●Triggerモードを使う条件
- 判定したいオブジェクトすべてにColliderコンポーネントがアタッチされている
- 判定したいオブジェクトの最低限一方にRigidbody(またはRigidbody2D)コンポーネントがアタッチされている
- 判定したいオブジェクトの最低限一方のColliderの【Is Trigger】がtrue(チェックあり)である
OnTriggerEnter2D | トリガーに接触したときに呼び出される |
OnTriggerStay2D | トリガーに接触している間呼び出される |
OnTriggerExit2D | トリガーに接触して、離れた瞬間に呼び出される |
OnTriggerEnter | トリガーに接触したときに呼び出される |
OnTriggerStay | トリガーに接触している間、呼び出される |
OnTriggerExit | トリガーに接触して、離れた瞬間に呼び出される |
まとめが多くなってしまった。少しでも当たり判定の勉強に参考になれば嬉しいです。
さぎのみや(@saginomiya8)でした。
コメント