【Unity】当たり判定を一通り!OnTrigger・OnCollisionをひとまとめ

unityで当たり判定をする時にはOnTriggerEnterやOnCollisionEnterなどいくつかの関数が使われます。

しかし、はじめのうちはどの関数を使えば良いかよくわからなかったりしますよね。

この記事では、

・当たり判定取得の説明

といった基本的なことや、

・当たり判定を取得する各種関数の違い

といった少し応用的なことまでわかりやすく解説します!

目次

Unityで当たり判定を取得するには?

unityで当たり判定を取得するにはコンポーネントを用います。

コンポーネントとはオブジェクトに追加することで様々なことをできるようにするための機能です。

当たり判定を行うために必要なコンポーネントとして主に二つあります。

一つ目が『〜Collider』です。

『〜』の部分にはboxやSphereなど形状が入り、物理衝突のための形状をオブジェクトに与えます。

二つ目が『Rigidbody』です。

これはオブジェクトに物理特性を与えるコンポーネントです。

当たり判定にはこれら二つのコンポーネントが必要です。

当たり判定についての詳しい説明は下記の記事を参考にしてください。

判定を取得する関数たちの違い!

判定を取得する関数たちは名前に「Collider」とつくものと、「Trigger」とつくものに大きく分かれます。

両者の違いは物体同士が当たった時の処理が「Collider」で、物体がすり抜けた時の処理が「Trigger」です。

それでは、判定を取得する関数のコードと動きをみていきましょう。

下準備としてオブジェクトを二つ配置しておきます。

また、上側のオブジェクトにはコンポーネント「BoxCollider」、「Script」、「Rigidbody」を追加しておきます。

3Dオブジェクトであれば「BoxCollider」はオブジェクト作成時に追加されます。

OnCollisionEnter

OnCollisionEnterは物体同士がぶつかった時に呼ばれます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    void OnCollisionEnter(Collision collision)
    {
        Debug.Log("当たった!");
    }
}

OnTriggerEnter

OnTriggerEnterは物体がすり抜けた時に呼ばれます。

物体をすり抜けさせるには「BoxCollider」の「Is Trigger」にチェックを入れましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    void OnTriggerEnter(Collider other)
    {
        Debug.Log("すり抜けた!");
    }
}

OnCollisionStay

OnCollisionStayは物体が当たっている時に呼ばれ続けます。

OnTriggerEnterとの違いはOnTriggerEnterは当たった時の一回しか呼ばれませんが、OnCollisionStayは当たっている間ずっと呼ばれ続ける点です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    void OnCollisionStay(Collision collision)
    {
        Debug.Log("当たっている");
    }

}

OnTriggerStay

OnTriggerStayは物体がすり抜けている時に呼ばれ続けます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{

    void OnTriggerStay(Collider other)
    {
        Debug.Log("すり抜けている");
    }
}

OnCollisionExit

OnCollisionExitは触れ合っている物体が離れた時に呼ばれます。

今回は上のオブジェクトがジャンプをできるようにして、下のオブジェクトと離れられるようにしましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    void Update()
    {
        //スペースボタンを押したらジャンプ
        if (Input.GetKey(KeyCode.Space))
        {
            GetComponent<Rigidbody>().velocity = new Vector3(0,5,0);
        }
    }

    void OnCollisionExit(Collision other)
    {
        Debug.Log("離れた!");
    }
}

OnTriggerExit

OnTriggerExitは物体が通り抜け終えた時に呼ばれます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    void OnTriggerExit(Collider other)
    {
        Debug.Log("通り抜け終えた");
    }
}

まとめ

いかがでしたか?

この記事ではOnTriggerEnterやOnCollisionEnterなどの当たり判定について扱ってきました。

当たり判定はよく使う技術なので、この記事を参考に使いこなせるようになりましょう!

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次