facebook twitter hatena line email

Unity/UniRx/複数イベント

提供: 初心者エンジニアの簡易メモ
2021年10月14日 (木) 21:46時点におけるAdmin (トーク | 投稿記録)による版 (PointerEventDataを引数として渡す場合)

移動: 案内検索

単純にトリガーをforeachで処理する場合

using UnityEngine;
using UniRx;
using UniRx.Triggers;
public class EventsAddComponentScene : MonoBehaviour
{
    void Start()
    {
        ObservableEventTriggers();
    }
    // 単純にトリガーをforeachで処理する場合
    public List<ObservableEventTrigger> observableEventTriggers;
    void ObservableEventTriggers()
    {
        foreach (var eventTrigger in observableEventTriggers) {
            eventTrigger
                .OnPointerEnterAsObservable()
                .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position)) // 触れた時 PointerExit (666.0, 1013.0)
                .AddTo(gameObject);
        }
    }
}
  1. オブジェクトを複数(とりあえず2つ)用意して、ObservableEventTriggerをAddComponentしておく。
  2. observableEventTriggersにトリガーとなるオブジェクトを、Inspectorから、ドラッグする

1つのObservableに複数イベントを統合して処理する場合

Unitを使い、引数を使わない場合

using UnityEngine;
using UniRx;
using UniRx.Triggers;
using System;
using UnityEngine.EventSystems;
public class EventsAddComponentScene : MonoBehaviour
{
    void Start()
    {
        OneObservableTriggers();
    }
    // 1つのObservableに複数イベントを統合して処理する場合
    public List<EventTrigger> eventTriggers;
    void OneObservableTriggers()
    {
        IObservable<Unit> triggerOnPointerEnterAsObservable;
        triggerOnPointerEnterAsObservable = Observable.Create<Unit>(observer =>
        {
            Debug.Log("eventTriggers.Count=" + eventTriggers.Count);
            foreach (var trigger in eventTriggers)
            {
                if (trigger == null) {
                    Debug.Log("trigger is null");
                }
                var pointerEnter = new EventTrigger.Entry
                {
                    eventID = EventTriggerType.PointerEnter
                };
                pointerEnter.callback.AddListener(data =>
                {
                    observer.OnNext(Unit.Default);
                });
                trigger.triggers.Add(pointerEnter);
            }
            return Disposable.Empty;
        });
        triggerOnPointerEnterAsObservable
            .Subscribe(pointerEventData => Debug.Log("PointerEnter"))
            .AddTo(gameObject);
    }
}
  1. オブジェクトを複数(とりあえず2つ)用意して、EventTriggerをAddComponentしておく。
  2. eventTriggersにトリガーとなるオブジェクトを、Inspectorから、ドラッグする

参考:https://www.hanachiru-blog.com/entry/2018/09/21/151426

PointerEventDataを引数として渡す場合

using UnityEngine;
using UniRx;
using UniRx.Triggers;
using System;
using UnityEngine.EventSystems;
public class EventsAddComponentScene : MonoBehaviour
{
    void Start()
    {
        OnePointerEventDataObservableTriggers();
    }
    // 1つのObservableに複数イベントを統合して処理し、PointerEventDataを引数として渡す場合
    public List<EventTrigger> eventTriggers;
    void OnePointerEventDataObservableTriggers()
    {
        IObservable<PointerEventData> triggerOnPointerEnterAsObservable;
        triggerOnPointerEnterAsObservable = Observable.Create<PointerEventData>(observer =>
        {
            foreach (var trigger in eventTriggers)
            {
                var pointerEnter = new EventTrigger.Entry
                {
                    eventID = EventTriggerType.PointerEnter
                };
                pointerEnter.callback.AddListener(data =>
                {
                    observer.OnNext((PointerEventData)data);
                });
                trigger.triggers.Add(pointerEnter);
            }
            return Disposable.Empty;
        });
        triggerOnPointerEnterAsObservable
            .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position))
            .AddTo(gameObject);
    }
}

参考:https://docs.unity3d.com/ja/2018.4/ScriptReference/EventSystems.EventTrigger.html