モノとモノが当たったことの判定

もくじ
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に、ぶつかってきた方のオブジェクトが入っている。