facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(サンプル)
(イベントインターバル)
 
(同じ利用者による、間の24版が非表示)
行1: 行1:
==サンプル==
+
==uGUIイベントのサンプル==
 
オブジェクトに、触れたときとか、外れたときとかのイベントを取得できる。
 
オブジェクトに、触れたときとか、外れたときとかのイベントを取得できる。
 +
ObservableEventTriggerを、オブジェクトに、事前にAddComponentしておいても良い。
 
<pre>
 
<pre>
GameObject eventTextObj = GameObject.Find("EventText");
+
using UniRx;
var eventTrigger = eventTextObj.AddComponent<ObservableEventTrigger>();
+
using UniRx.Triggers;
          
+
 
eventTrigger.OnPointerEnterAsObservable()
+
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));
 +
    }
 +
}
 +
 
 +
</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)); // 外れた時
+
}
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>
 
</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));

2023年3月10日 (金) 03:22時点における最新版

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));