時偶(ときたま)ブログ

40代のおとうちゃんが徒然に、ときたま書いてるブログです

【Unity】EventTriggerの追加

方法

以下のメソッドを追加する。

    /// EventTriggerを取り付けて各種イベントリスナーを設定する
    private void AddEventTrigger(GameObject obj, params EventTriggerType[] types) {
        EventTrigger et = obj.GetComponent<EventTrigger>();
        if (et == null) {
            et = obj.gameObject.AddComponent<EventTrigger>();
        }
        AddEventTriggerListener(et, types);
    }


    /// 各種イベントリスナーを設定する
    private void AddEventTriggerListener(EventTrigger et, params EventTriggerType[] types) {
        foreach (var type in types) {
            EventTrigger.Entry entry = new EventTrigger.Entry {
                eventID = type
            };

            switch (entry.eventID) {
                case EventTriggerType.PointerDown:
                    entry.callback.AddListener((eventData) => { OnPointerDown((PointerEventData)eventData); });
                    break;

                case EventTriggerType.PointerUp:
                    entry.callback.AddListener((eventData) => { OnPointerUp((PointerEventData)eventData); });
                    break;

                case EventTriggerType.Drag:
                    entry.callback.AddListener((eventData) => { OnDrag((PointerEventData)eventData); });
                    break;

                default:
                    throw new NotImplementedException("No souch method name");
            }

            et.triggers.Add(entry);
        }
    }

    private void OnDrag(PointerEventData eventData) {
        // ドラッグ処理
    }

    private void OnPointerUp(PointerEventData eventData) {
        // ポインター、マウスのアップ時処理
    }

    private void OnPointerDown(PointerEventData eventData) {
        // ポインター、マウスのダウン時処理
    }
使い方

AddEventTrigger()の第一引数にイベントをアタッチしたいオブジェクトを渡す。 第二引数が可変になっているので、
追加したいオプションを渡していく。
AddEventTriggerListener()内のswitchに無いものはその都度追加する。

 AddEventTrigger(_btOpenDebugOption.gameObject,
            EventTriggerType.PointerDown, EventTriggerType.PointerUp, EventTriggerType.Drag);

ただし、ScrollViewのスクロールが反応しなくなる場合がある。
その場合はこの方法は諦める。

代案として

ハンドラーを継承したスクリプトをアタッチする。

using UnityEngine;
using UnityEngine.EventSystems;

public class ContentClickListener : MonoBehaviour, IPointerDownHandler {
    
    public void OnPointerDown(PointerEventData eventData) {
        // ポインター、マウスのダウン時処理
    }
}