以前Graphic を利用してタップした座標から Ray を飛ばしてタップしたオブジェクトを取得する方法を記述した。
【Unity】uGUI を利用してタップした位置のオブジェクトを取得する - うにてぃブログ
しかし、これだと様々な uGUI Event (PointerDown や PointerEnter など) に対応できない
そのため、uGUI Event に対応したやり方を記述する
PhysicsRaycaster, Physics2DRaycaster
カメラにつけることで、Ray を飛ばして uGUI Event を取得することができるコンポーネント
対象となるオブジェクトには Collider
もしくは Collider2D
と EventTrigger
がついている必要がある
また、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); } }