「Unity/UniRx/EventTrigger」の版間の差分
ナビゲーションに移動
検索に移動
| (同じ利用者による、間の21版が非表示) | |||
| 1行目: | 1行目: | ||
== | ==uGUIイベントのサンプル== | ||
オブジェクトに、触れたときとか、外れたときとかのイベントを取得できる。 | オブジェクトに、触れたときとか、外れたときとかのイベントを取得できる。 | ||
ObservableEventTriggerを、オブジェクトに、事前にAddComponentしておいても良い。 | ObservableEventTriggerを、オブジェクトに、事前にAddComponentしておいても良い。 | ||
| 14行目: | 14行目: | ||
eventTrigger.OnPointerEnterAsObservable() | eventTrigger.OnPointerEnterAsObservable() | ||
.Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position)); // 触れた時 | .Subscribe(pointerEventData => Debug.Log("PointerEnter " + pointerEventData.position)); // 触れた時 PointerEnter (666.0, 1013.0) | ||
eventTrigger.OnPointerExitAsObservable() | eventTrigger.OnPointerExitAsObservable() | ||
.Subscribe(pointerEventData => Debug.Log("PointerExit " + pointerEventData.position)); // 外れた時 | .Subscribe(pointerEventData => Debug.Log("PointerExit " + pointerEventData.position)); // 外れた時 | ||
| 48行目: | 48行目: | ||
eventTrigger.OnMoveAsObservable() | eventTrigger.OnMoveAsObservable() | ||
.Subscribe(axisEventData => Debug.Log("Move " + axisEventData.moveVector)); | .Subscribe(axisEventData => Debug.Log("Move " + axisEventData.moveVector)); | ||
} | } | ||
} | } | ||
</pre> | |||
参考:https://qiita.com/tkyaji/items/a67bae1177d7a3da1a27 | |||
==反応しない場合== | ==反応しない場合== | ||
Scene内に、EventSystemのゲームオブジェクトがあるか確認。 | 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) | |||
} | |||
} | |||
</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() | |||
.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); | |||
<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のオブジェクトをドラッグする場合
- 適当にカメラとかに以下Sceneをaddしておく。
- 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);