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

2023年4月1日

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

シンプルな構成

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

using UnityEngine;
using UnityEngine.Events;

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

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

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

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

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

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

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

次のエラーメッセージがポップアップされます
これは、何らかのコライダーをまずアタッチしてくださいとの要求になります(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が必要であることが示されています。これにより、Colliderが自動的にアタッチされるようになります。

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

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

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