もくじ
https://tera1707.com/entry/2022/02/06/144447
やりたいこと
モノとモノが当たったことを判定したい。
本当は当たった判定して、バットとボールのようにカキーンと跳ね返すようなことがしたいが、とりあえず判定だけしたい。
やりかた
BoxColider
と、OnTriggerEnter()
を使う。
https://docs.unity3d.com/ja/2020.3/ScriptReference/Collider.OnTriggerEnter.html
やり方詳細①(Is Triggerを付ける方法)
まず、ほかのモノが当たってきたことを知りたいモノの「Is Trigger」にチェックを入れる。
(注意:Is Triggerにチェックをいれると、ほかのモノと当たっても、すり抜けるようになる)
当たったときのスクリプトを書く。
下記は、当たってきたモノのnameを出力するスクリプト。
using UnityEngine; public class AtattaHantei : MonoBehaviour { private void OnTriggerEnter(Collider other) { Debug.Log(other.name); } }
やり方詳細②(Is Triggerを付けない方法)
Is Triggerを付けないので、物理的当たり判定はそのまま(判定ありのまま)で、衝突を検知したいときはこちらっぽい。
- 2つのオブジェクトに、Collider(例えばBoxCollider)を設定する。
- 衝突を判定したいオブジェクトのC#に、
private void OnCollisionEnter(Collision other)
を定義する。
private void OnCollisionEnter(Collision collision) { // 衝突時にやりたいことを書く }
- 複数のオブジェクトを判別したいときは、相手のオブジェクトにTagを付ける。
Tagは、オブジェクトのInspectorの上の方のTagランで「Add Tags」を押して、Tagを追加し、そのタグを選ぶ。
で、判定したいオブジェクトのほう(Tagをつけたオブジェクトにぶつかられた方)で 、if (other.gameObject.CompareTag("TagName"))
のような感じでTag名で判定を入れる。
private void OnCollisionEnter(Collision collision) { if (collision.gameObject.CompareTag("Ground") && !gameOver) // ★ココ { isOnGround = true; dirtParticle.Play(); } else if (collision.gameObject.CompareTag("Obstacle")) // ★ココ { Debug.Log("Game Over..."); gameOver = true; playerAmin.SetBool("Death_b", true); playerAmin.SetInteger("DeathType_int", 1); explosionParticle.Play(); playerAudio.PlayOneShot(crashSound, 1.0f); dirtParticle.Stop(); } }
※上記コードでは、引数のcollision
に、ぶつかってきた方のオブジェクトが入っている。