「Unity/UniRx/EventTrigger」の版間の差分

提供: 初心者エンジニアの簡易メモ
ナビゲーションに移動 検索に移動
編集の要約なし
 
(同じ利用者による、間の23版が非表示)
1行目: 1行目:
==サンプル==
==uGUIイベントのサンプル==
オブジェクトに、触れたときとか、外れたときとかのイベントを取得できる。
オブジェクトに、触れたときとか、外れたときとかのイベントを取得できる。
ObservableEventTriggerを、オブジェクトに、事前にAddComponentしておいても良い。
ObservableEventTriggerを、オブジェクトに、事前にAddComponentしておいても良い。
6行目: 6行目:
using UniRx.Triggers;
using UniRx.Triggers;


GameObject eventTextObj = GameObject.Find("EventText");
public class EventScene : MonoBehaviour
var eventTrigger = eventTextObj.AddComponent<ObservableEventTrigger>();
{
          
    void Start()
eventTrigger.OnPointerEnterAsObservable()
    {
        GameObject eventTextObj = GameObject.Find("EventText");
        var eventTrigger = eventTextObj.AddComponent<ObservableEventTrigger>();
 
        eventTrigger.OnPointerEnterAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position)); // 触れた時 PointerEnter (666.0, 1013.0)
        eventTrigger.OnPointerExitAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerExit " + pointerEventData.position)); // 外れた時
        eventTrigger.OnDragAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("Drag " + pointerEventData.position));
        eventTrigger.OnPointerDownAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerDown " + pointerEventData.position)); // downした時
        eventTrigger.OnPointerClickAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerClick " + pointerEventData.position)); // upした時だが、PointerUpの後に実行
        eventTrigger.OnPointerUpAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerUp " + pointerEventData.position)); // upした時
        eventTrigger.OnBeginDragAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("BeginDrag " + pointerEventData.position));
        eventTrigger.OnEndDragAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("EndDrag " + pointerEventData.position));
        eventTrigger.OnDropAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("Drop " + pointerEventData.position)); // EndDragとほぼ同じで、EndDragより早い。
        eventTrigger.OnInitializePotentialDragAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("Initialize " + pointerEventData.position)); // downした時とほぼ同じで、少し後
        eventTrigger.OnScrollAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("Scroll " + pointerEventData.position)); // オブジェクト上でscrollした時
        // 以下は、反応しない
        eventTrigger.OnDeselectAsObservable()
                    .Subscribe(baseEventData => Debug.Log("Deselect " + baseEventData.selectedObject));
        eventTrigger.OnSelectAsObservable()
                    .Subscribe(baseEventData => Debug.Log("Select " + baseEventData.selectedObject));
        eventTrigger.OnSubmitAsObservable()
                    .Subscribe(baseEventData => Debug.Log("Submit " + baseEventData.selectedObject));
        eventTrigger.OnCancelAsObservable()
                    .Subscribe(baseEventData => Debug.Log("Cancel " + baseEventData.selectedObject));
        eventTrigger.OnUpdateSelectedAsObservable()
                    .Subscribe(baseEventData => Debug.Log("UpdateSelected " + baseEventData.selectedObject));
         eventTrigger.OnMoveAsObservable()
                    .Subscribe(axisEventData => Debug.Log("Move " + axisEventData.moveVector));
    }
}
</pre>
 
参考:https://qiita.com/tkyaji/items/a67bae1177d7a3da1a27
 
==反応しない場合==
Scene内に、EventSystemのゲームオブジェクトがあるか確認。
 
==Updateを実行する場合==
<pre>
eventTrigger.UpdateAsObservable()
    .Subscribe(_ => Debug.Log("update"));
 
eventTrigger.FixedUpdateAsObservable()
    .Subscribe(_ => Debug.Log("fixedupdate"));
</pre>
 
==AsObservableを変数にしたい場合==
UpdateAsObservableでは、IObservable<Unit>を型に設定すれば良い。
<pre>
using System;
IObservable<Unit> updateAsObservable = eventTrigger.UpdateAsObservable();
updateAsObservable.Subscribe(_ => Debug.Log("update"));
</pre>
 
OnPointerDownAsObservableでは、IObservable<PointerEventData>を型にすれば良い。
<pre>
using System;
using UnityEngine.EventSystems;
IObservable<PointerEventData> eventOnPointerDownAsObservable = eventTrigger.OnPointerDownAsObservable();
eventOnPointerDownAsObservable.Subscribe(pointerEventData => Debug.Log("OnPointerDown"));
</pre>
 
==EventTriggerのオブジェクトをドラッグする場合==
#適当にカメラとかに以下Sceneをaddしておく。
#ObservableEventTrigger型でpublicでプロパティを用意しておき、そこに対象となる、GameObjectをドラッグすれば良い。
<pre>
public class EventAddComponentScene : MonoBehaviour
{
    public ObservableEventTrigger eventTrigger;
    void Start()
    {
        eventTrigger.OnPointerEnterAsObservable()
             .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position)); // 触れた時 PointerExit (666.0, 1013.0)
             .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position)); // 触れた時 PointerExit (666.0, 1013.0)
eventTrigger.OnPointerExitAsObservable()
    }
            .Subscribe(pointerEventData => Debug.Log("PointerExit " + pointerEventData.position)); // 外れた時
}
</pre>
 
==uGUIでなく、3Dオブジェクトを対象とする場合==
2Dの場合は必要なかったが、
 
MainCameraに、"Physics Raycaster"をAddComponentすれば良い。
 
===Chinemachineを使ってる場合===
その場合も、MainCameraに、"Physics Raycaster"を追加すれば良い。
 
==イベントインターバル==
例:ドラッグしても、1秒ごとにしか呼び出さないように
eventTrigger.OnDragAsObservable().ThrottleFirst(TimeSpan.FromSeconds(1f))
    .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position));
 
==マウス座標をGameObjectのローカル座標へ==
<pre>
eventTrigger.OnDragAsObservable()
eventTrigger.OnDragAsObservable()
            .Subscribe(pointerEventData => Debug.Log("Drag " + pointerEventData.position));
    .Subscribe(pointerEventData => {
eventTrigger.OnPointerDownAsObservable()
        Vector2 localPos;
            .Subscribe(pointerEventData => Debug.Log("PointerDown " + pointerEventData.position)); // downした時
        // Canvas が ScreenSpaceOverlay なら camera = null
eventTrigger.OnPointerClickAsObservable()
        RectTransformUtility.ScreenPointToLocalPointInRectangle(
            .Subscribe(pointerEventData => Debug.Log("PointerClick " + pointerEventData.position)); // upした時だが、PointerUpの後に実行
             graph.rectTransform,
eventTrigger.OnPointerUpAsObservable()
             pointerEventData.position,
            .Subscribe(pointerEventData => Debug.Log("PointerUp " + pointerEventData.position)); // upした時
             pointerEventData.pressEventCamera,
eventTrigger.OnBeginDragAsObservable()
             out localPos
            .Subscribe(pointerEventData => Debug.Log("BeginDrag " + pointerEventData.position));
        );
eventTrigger.OnEndDragAsObservable()
        Debug.Log($"Local Position: {localPos}");
            .Subscribe(pointerEventData => Debug.Log("EndDrag " + pointerEventData.position));
    }).AddTo(disposable);
eventTrigger.OnDropAsObservable()
<pre>
             .Subscribe(pointerEventData => Debug.Log("Drop " + pointerEventData.position)); // EndDragとほぼ同じで、EndDragより早い。
eventTrigger.OnInitializePotentialDragAsObservable()
             .Subscribe(pointerEventData => Debug.Log("Initialize " + pointerEventData.position)); // downした時とほぼ同じで、少し後
eventTrigger.OnScrollAsObservable()
             .Subscribe(pointerEventData => Debug.Log("Scroll " + pointerEventData.position)); // オブジェクト上でscrollした時
// 以下は、反応しない
eventTrigger.OnDeselectAsObservable()
             .Subscribe(baseEventData => Debug.Log("Deselect " + baseEventData.selectedObject));
eventTrigger.OnSelectAsObservable()
            .Subscribe(baseEventData => Debug.Log("Select " + baseEventData.selectedObject));
eventTrigger.OnSubmitAsObservable()
            .Subscribe(baseEventData => Debug.Log("Submit " + baseEventData.selectedObject));
eventTrigger.OnCancelAsObservable()
            .Subscribe(baseEventData => Debug.Log("Cancel " + baseEventData.selectedObject));
eventTrigger.OnUpdateSelectedAsObservable()
            .Subscribe(baseEventData => Debug.Log("UpdateSelected " + baseEventData.selectedObject));
eventTrigger.OnMoveAsObservable()
            .Subscribe(axisEventData => Debug.Log("Move " + axisEventData.moveVector));
</pre>

2025年12月17日 (水) 21:36時点における最新版

uGUIイベントのサンプル

オブジェクトに、触れたときとか、外れたときとかのイベントを取得できる。 ObservableEventTriggerを、オブジェクトに、事前にAddComponentしておいても良い。

using UniRx;
using UniRx.Triggers;

public class EventScene : MonoBehaviour
{
    void Start()
    {
        GameObject eventTextObj = GameObject.Find("EventText");
        var eventTrigger = eventTextObj.AddComponent<ObservableEventTrigger>();

        eventTrigger.OnPointerEnterAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position)); // 触れた時 PointerEnter (666.0, 1013.0)
        eventTrigger.OnPointerExitAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerExit " + pointerEventData.position)); // 外れた時
        eventTrigger.OnDragAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("Drag " + pointerEventData.position));
        eventTrigger.OnPointerDownAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerDown " + pointerEventData.position)); // downした時
        eventTrigger.OnPointerClickAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerClick " + pointerEventData.position)); // upした時だが、PointerUpの後に実行
        eventTrigger.OnPointerUpAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("PointerUp " + pointerEventData.position)); // upした時
        eventTrigger.OnBeginDragAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("BeginDrag " + pointerEventData.position));
        eventTrigger.OnEndDragAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("EndDrag " + pointerEventData.position));
        eventTrigger.OnDropAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("Drop " + pointerEventData.position)); // EndDragとほぼ同じで、EndDragより早い。
        eventTrigger.OnInitializePotentialDragAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("Initialize " + pointerEventData.position)); // downした時とほぼ同じで、少し後
        eventTrigger.OnScrollAsObservable()
                    .Subscribe(pointerEventData => Debug.Log("Scroll " + pointerEventData.position)); // オブジェクト上でscrollした時
        // 以下は、反応しない
        eventTrigger.OnDeselectAsObservable()
                    .Subscribe(baseEventData => Debug.Log("Deselect " + baseEventData.selectedObject));
        eventTrigger.OnSelectAsObservable()
                    .Subscribe(baseEventData => Debug.Log("Select " + baseEventData.selectedObject));
        eventTrigger.OnSubmitAsObservable()
                    .Subscribe(baseEventData => Debug.Log("Submit " + baseEventData.selectedObject));
        eventTrigger.OnCancelAsObservable()
                    .Subscribe(baseEventData => Debug.Log("Cancel " + baseEventData.selectedObject));
        eventTrigger.OnUpdateSelectedAsObservable()
                    .Subscribe(baseEventData => Debug.Log("UpdateSelected " + baseEventData.selectedObject));
        eventTrigger.OnMoveAsObservable()
                    .Subscribe(axisEventData => Debug.Log("Move " + axisEventData.moveVector));
    }
}

参考:https://qiita.com/tkyaji/items/a67bae1177d7a3da1a27

反応しない場合

Scene内に、EventSystemのゲームオブジェクトがあるか確認。

Updateを実行する場合

eventTrigger.UpdateAsObservable()
    .Subscribe(_ => Debug.Log("update"));

eventTrigger.FixedUpdateAsObservable()
    .Subscribe(_ => Debug.Log("fixedupdate"));

AsObservableを変数にしたい場合

UpdateAsObservableでは、IObservable<Unit>を型に設定すれば良い。

using System;
IObservable<Unit> updateAsObservable = eventTrigger.UpdateAsObservable();
updateAsObservable.Subscribe(_ => Debug.Log("update"));

OnPointerDownAsObservableでは、IObservable<PointerEventData>を型にすれば良い。

using System;
using UnityEngine.EventSystems;
IObservable<PointerEventData> eventOnPointerDownAsObservable = eventTrigger.OnPointerDownAsObservable();
eventOnPointerDownAsObservable.Subscribe(pointerEventData => Debug.Log("OnPointerDown"));

EventTriggerのオブジェクトをドラッグする場合

  1. 適当にカメラとかに以下Sceneをaddしておく。
  2. ObservableEventTrigger型でpublicでプロパティを用意しておき、そこに対象となる、GameObjectをドラッグすれば良い。
public class EventAddComponentScene : MonoBehaviour
{
    public ObservableEventTrigger eventTrigger;
    void Start()
    {
        eventTrigger.OnPointerEnterAsObservable()
            .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position)); // 触れた時 PointerExit (666.0, 1013.0)
    }
}

uGUIでなく、3Dオブジェクトを対象とする場合

2Dの場合は必要なかったが、

MainCameraに、"Physics Raycaster"をAddComponentすれば良い。

Chinemachineを使ってる場合

その場合も、MainCameraに、"Physics Raycaster"を追加すれば良い。

イベントインターバル

例:ドラッグしても、1秒ごとにしか呼び出さないように

eventTrigger.OnDragAsObservable().ThrottleFirst(TimeSpan.FromSeconds(1f))
    .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position));

マウス座標をGameObjectのローカル座標へ

eventTrigger.OnDragAsObservable()
    .Subscribe(pointerEventData => {
        Vector2 localPos;
        // Canvas が ScreenSpaceOverlay なら camera = null
        RectTransformUtility.ScreenPointToLocalPointInRectangle(
            graph.rectTransform,
            pointerEventData.position,
            pointerEventData.pressEventCamera,
            out localPos
        );
        Debug.Log($"Local Position: {localPos}");
    }).AddTo(disposable);