うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】uGUI でないオブジェクトのタップ等のイベントを監視する

以前Graphic を利用してタップした座標から Ray を飛ばしてタップしたオブジェクトを取得する方法を記述した。

【Unity】uGUI を利用してタップした位置のオブジェクトを取得する - うにてぃブログ

しかし、これだと様々な uGUI Event (PointerDown や PointerEnter など) に対応できない

そのため、uGUI Event に対応したやり方を記述する

PhysicsRaycaster, Physics2DRaycaster

カメラにつけることで、Ray を飛ばして uGUI Event を取得することができるコンポーネント

f:id:hacchi_man:20210725203358p:plain:w350

対象となるオブジェクトには Collider もしくは Collider2DEventTrigger がついている必要がある

また、EventSystem が存在しない場合は反応しないので注意

サンプル

_targetGameObjects に登録したオブジェクトに、EventTrigger をセットして PointerDown のイベントを登録するようなサンプル

eventData.selectedObject を利用すればタップしたオブジェクトを取得できるかと思いきや null になっているため、PointerEventData にキャストしてから適切な変数からタップした GameObject を取得する必要がある

using UnityEngine;
using UnityEngine.EventSystems;
 
public class SampleMonoBehaviour : MonoBehaviour
{
    [SerializeField]
    private GameObject[] _targetGameObjects;
 
    private void Awake()
    {
        foreach (var target in _targetGameObjects)
        {
            var et = target.AddComponent<EventTrigger>();
            var entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerDown;
            entry.callback.AddListener(v => Click(v));
            et.triggers.Add(entry);
        }
    }
 
    private void Click(BaseEventData eventData)
    {
        var pointerEventData = (PointerEventData)eventData;
        Debug.Log(pointerEventData.pointerEnter);
    }
}