MRが楽しい

MRやVRについて学習したことを書き残す

Colliderのクリック判定で表面のみに反応させる

本日はUnityの小ネタ枠です。
Colliderのクリック判定で表面のみに反応させる方法です。

Colliderのクリック判定の表裏

IsTriggerを有効にしたMeshColliderやBoxColliderなどには裏表の判定がありません。
以下のスクリプトを設定した裏表のPlaneを並べた場合、どちらのクリックもクリック判定が発生します。

using UnityEngine;
using UnityEngine.EventSystems;

public class NormalColliderTest : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log($"OnPointerClick : {gameObject.name}");
    }
}



Colliderのクリック判定で表面のみに反応させる

Collider自体の仕組みで表裏を判別する仕組みはありません。
以下のようにクリックイベントを受け取った際にレイキャストの法線を参照することでどちら方向からのクリックかを判別して対処します。

using UnityEngine;
using UnityEngine.EventSystems;

public class TwoFaceColliderTest : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        // 裏面(Y軸下方を裏面とする)からクリックされた場合は処理を終了する
        if (Vector3.Dot(Vector3.down, eventData.pointerPressRaycast.worldNormal) < 0)
        {
            Debug.Log($"OnPointerClick : {gameObject.name} (Backface)");
            return;
        }
        
        Debug.Log($"OnPointerClick : {gameObject.name}");
    }
}

docs.unity3d.com
docs.unity3d.com

これで表面からのクリックを判定できました。