- UnityでTriggerモード(すり抜ける)タイプの当たり判定を作りたい
- 衝突するオブジェクト両方に【Is Trigger】ってチェック(true)すべきなの?
その悩みを解決します。
結論として片方だけでも良いです。
両方の【Is Trigger】にチェックを外すのはダメです。Collision系のメソッド【OnCollisionEnter】とかしか使えなくなります。
2Dでも3Dでも同じです。
【Is Trigger】のチェックは片方だけでも良い
●Is Triggerにチェックをつける方法
【オブジェクト選択】→【Inspector】→【〇〇 Collider】→【Is Trigger】→【チェック】
最初に述べた通りにTrigger系のメソッドを実行させたい場合は、衝突するオブジェクトの片方の【Is Trigger】にチェックがついていればOKです。
正確な言い方だと、最低限一方のオブジェクトの【Is Trigger】にチェックがついていればOKです。
どちらもついていない状態だとTrigger系のメソッドを使うことができません。
Triggerモードを使う条件
- 判定したいオブジェクトすべてにColliderコンポーネントがアタッチされている
- 判定したいオブジェクトの最低限一方にRigidbody(またはRigidbody2D)コンポーネントがアタッチされている
- 判定したいオブジェクトの最低限一方のColliderの【Is Trigger】がtrue(チェックあり)である
Trigger系のメソッドを使いたい場合はこの条件を満たしてないといけません( ・∇・)
ここから下は実験です。興味がある方はご覧ください。
実験
爆弾
アタッチされてるもの 【Circle Collider2D】【Rigidbody 2D】
プレイヤー(緑のやつ)
アタッチされてるもの 【Box Collider 2D】【PlayerControllerスクリプト(当然名前はなんでも良き)】
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log("miya");
}
}
スクリプトにはオブジェクトと接触した瞬間に、「miya」とコンソールに表示されるようにしてます。
この状態で実験を行います。
【Is Trigger】のチェックが両方ついていないvar
はいふざけてます。なにも起こりません。
【Is Trigger】のチェックがスクリプトがアタッチされている方のみにチェックされているvar
プレイヤーだけの【Is Trigger】にチェックがついている状態です。メソッドが実行されています。
【Is Trigger】のチェックがスクリプトがアタッチされていない方のみにチェックされているvar
爆弾のだけの【Is Trigger】にチェックがついている状態です。メソッドが実行されています。
【Is Trigger】のチェックが両方ついていないvar
爆弾とプレイヤーの【Is Trigger】にチェックがついている状態です。メソッドが実行されています。
Trigger系のメソッド
どうぞ。
2Dで使えるメソッド
OnTriggerEnter2D | トリガーに接触したときに呼び出される |
OnTriggerStay2D | トリガーに接触している間呼び出される |
OnTriggerExit2D | トリガーに接触して、離れた瞬間に呼び出される |
これらです。
まあトリガーっていってますけど、オブジェクト同士が接触したときって発想で良いです。厳密には違いますが、わかりやすい方が良いもんね。
3Dで使えるメソッド
OnTriggerEnter | トリガーに接触したときに呼び出される |
OnTriggerStay | トリガーに接触している間、呼び出される |
OnTriggerExit | トリガーに接触して、離れた瞬間に呼び出される |
これらです。
まとめ
- Trigger系のメソッドを使うときは衝突するオブジェクトの最低限一方の【Is Trigger】がチェックあり(true)であれば良い
こんな記事もあります。
さぎのみや(@saginomiya8)でした。
コメント