【Unity】当たり判定の汎用化

2023年9月20日

当たり判定用のスクリプトを作成し、判定が必要なたびに再利用ができるようにします

サンプルコードは、特定のオブジェクトとの衝突を検出するために使用され、衝突が継続している間にイベントをトリガーします。また、このスクリプトはUnityエディターで編集できるようになっており、InspectorビューでTriggerEvent UnityEventを設定できます

サンプルシーンの構成

このスクリプトを空のゲームオブジェクトにアタッチします

using UnityEngine;
using UnityEngine.Events;

[RequireComponent(typeof(Collider))]
public class CollisionDetector : MonoBehaviour
{
    [SerializeField]
    UnityEvent<Collider> onTriggerStay;

    private void OnTriggerStay(Collider other)
    {
        onTriggerStay.Invoke(other);
    }
}

ゲームオブジェクトにアタッチされたCollider(当たり判定)の範囲内にある他のオブジェクトとの衝突を検出するスクリプトです。

[RequireComponent(typeof(Collider))]属性により、このスクリプトがアタッチされたオブジェクトにColliderが必要であることが示されています。コライダーには、いろいろな種類がありますので、これにより、Colliderのいずれかをアタッチするように要求されます(後述)
Rigidbodyと記述するなどコンポーネントが限定されている場合、自動的にそのコンポーネントがアタッチされるようになります。

UnityEventを使用して、他のオブジェクトとの衝突が継続している間に呼び出されるイベントを設定します。[SerializeField]属性により、Inspectorビューでイベントを設定できるようにします。また、ジェネリック型であるUnityEvent<Collider>を使用して、衝突している他のオブジェクトのColliderを引数として取ります。

次に、OnTriggerStayメソッドが他のオブジェクトとの衝突が継続している間に呼び出され、設定されたUnityEventが呼び出されます

空のゲームオブジェクトにこのスクリプトのみをアタッチした場合

次のエラーメッセージがポップアップされます
これは、何らかのコライダーをまずアタッチしてくださいとの要求になります(Colliderを継承しているコンポーネント)

BoxCollier等Colliderを継承している何らかのコライダーコンポーネントをアタッチした後、Is Triggerのチェックを入れます

次にインスペクターのスクリプトに表示されているイベント登録にに実行したいメソッド(イベント)をアウトレット接続(アタッチ)します

(参考)TriggerEventを別クラス化する場合

using System;
using UnityEngine;
using UnityEngine.Events;

[RequireComponent(typeof(Collider))]
public class CollisionDetector : MonoBehaviour
{
    [SerializeField]
    TriggerEvent onTriggerStay = new TriggerEvent();

    private void OnTriggerStay(Collider other)
    {
        onTriggerStay.Invoke(other);
    }

    [Serializable]
    public class TriggerEvent : UnityEvent<Collider>
    {
    }
}

このコードは、UnityのゲームオブジェクトにアタッチされたCollider(当たり判定)の範囲内にある他のオブジェクトとの衝突を検出するスクリプトです。

まず、usingディレクティブで必要な名前空間を読み込んでいます。次に、[RequireComponent(typeof(Collider))]属性により、このスクリプトがアタッチされたオブジェクトにColliderが必要であることが示されています。BoxColliderなどColliderを継承しているコンポーネントをアタッチしましょう

OnTriggerStayメソッドが他のオブジェクトとの衝突が継続している間に呼び出され、onTriggerStay UnityEventが呼び出されます。このUnityEventは、UnityEvent<Collider>ジェネリッククラスを継承しており、衝突している他のオブジェクトのColliderを引数として取ります。

[Serializable]属性が付けられたTriggerEventクラスは、UnityEventを継承しており、Inspectorビューで表示できるようにします。また、[SerializeField]属性を使用して、このクラスのインスタンスがシリアライズされ、Unityエディターで編集できるようにします。