「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) | ||
− | + | } | |
− | + | } | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</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のオブジェクトをドラッグする場合
- 適当にカメラとかに以下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));