汎用的な当たり判定スクリプト

当たり判定は、OnTrigger系のイベントとOnCollision系のイベントがあります
必要なスクリプトに都度記述してもいいのですが、オブジェクトにアタッチすることでこのイベントを更にイベントとして通知できる仕組みにしてみます

汎用スクリプトの仕組み

コード内には、具体的にどのメソッドを実行するかは記述せずにインスペクタで登録するようにします

イメージ

当たり判定を汎用的に使えるコード

コードはトリガーが発生したらonTriggerStay変数に登録されているメソッドを全て実行するようになっています

onTriggerStayは、今回名前づけされたもので、イベントのOnTriggerStayとは無関係です(o と Oが違いますね。C#では大文字小文字違いは別物を扱います)

public class CollisionDetector : MonoBehaviour
{
    [SerializeField]
    UnityEvent<Collider> onTriggerStay;

    // Is TriggerがONで他のColliderと重なっているときは
    // このメソッドが常にコールされる
    private void OnTriggerStay(Collider other)
    {
        // onTriggerStayで指定された処理を実行する
        onTriggerStay.Invoke(other);
    }
}

インスペクタで実行してほしいメソッドを登録

コライダーがアタッチされたオブジェクトにスクリプトをアタッチします

イベントの登録箇所に当たり判定検出時に実行したいメソッドを登録します
他のオブジェクトにアタッチされているメソッドでも構いません

参考

UnityのUnityEvent仕様変更前のコード

UnityEvent<xxx>は抽象クラスだったので、一旦継承させて使う必要がありました

using System;
using UnityEngine;
using UnityEngine.Events;

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

    /// <summary>
    /// Is TriggerがONで他のColliderと重なっているときは、このメソッドが常にコールされる
    /// </summary>
    /// <param name="other"></param>
    private void OnTriggerStay(Collider other)
    {
        // onTriggerStayで指定された処理を実行する
        onTriggerStay.Invoke(other);
    }

    // UnityEventを継承したクラスに[Serializable]属性を付与することで、Inspectorウインドウ上に表示できるようになる。
    [Serializable]
    public class TriggerEvent : UnityEvent<Collider>
    {
    }
}

Unity,イベント

Posted by hidepon