using System.Collections; using System.Collections.Generic; using UnityEngine; using EZXR.Glass.Inputs; namespace EZXR.Glass.UI { public abstract class SpatialSelectable : SpatialUIElement { /// /// 是否启用导航 /// public bool navigation; /// /// 当此元素出现时将作为当前被选中的元素继续进行导航 /// public bool beFocusedWhenEnabled; /// /// 在此元素被设为被选中元素时,记录之前被选中的元素,以便此元素被Disabled的时候将focus权交会 /// SpatialSelectable lastFocusedElement; public SpatialSelectable navigationUp; public SpatialSelectable navigationDown; public SpatialSelectable navigationLeft; public SpatialSelectable navigationRight; public abstract void OnRayCastHit(InputInfoBase handInfo); protected override void OnEnable() { base.OnEnable(); if (Application.isPlaying) { if (beFocusedWhenEnabled) { lastFocusedElement = SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement; SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement = this; SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement.OnPointerHoverEnter(); } } } protected override void OnDisable() { base.OnDisable(); if (SpatialUIEventSystem.Instance != null && SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement != null && lastFocusedElement != null) { SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement.OnPointerHoverExit(); if (beFocusedWhenEnabled) { SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement = lastFocusedElement; lastFocusedElement = null; } } } #region Pointer Event /// /// 近距离或射线操作时,近距离操作时用户食指指尖进入了Button上方或者离开了Button上方,射线操作时触碰到了Button上表面 /// public virtual void OnPointerHoverEnter(Spatial.InteractiveMode interactiveMode = Spatial.InteractiveMode.None) { Debug.Log("OnPointerHoverEnter"); if (SpatialUIEventSystem.Instance.CurrentHoverSpatialUIElement != null) { SpatialUIEventSystem.Instance.CurrentHoverSpatialUIElement.OnPointerHoverExit(); } SpatialUIEventSystem.Instance.CurrentHoverSpatialUIElement = this; } /// /// 近距离操作时,指尖触碰到了Button上表面时触发;远距离操作时,射线在Button上捏合手指时触发,将会同时顺序触发OnPointerStartPress和OnPointerDown) /// public virtual void OnPointerStartPress() { Debug.Log("OnPointerStartPress"); } /// /// 近距离或射线操作时,近距离操作时Button被按下但是没有到底时触发(每帧),射线操作时Button被按下时触发(每帧) /// public virtual void OnPointerPressing() { //Debug.Log("OnPointerPressing"); } /// /// 近距离或射线操作时,Button被按到底时触发(对于射线,将会同时顺序触发OnPointerStartPress和OnPointerDown) /// public virtual void OnPointerDown() { Debug.Log("OnPointerDown"); } /// /// 近距离或射线操作时,Button被完全松开时触发(对于射线,将会同时顺序触发OnPointerUp和OnPointerEndPress) /// public virtual void OnPointerUp() { Debug.Log("OnPointerUp"); } /// /// 近距离或射线操作时,指尖或射线离开了Button上表面(对于射线,将会同时顺序触发OnPointerUp和OnPointerEndPress) /// public virtual void OnPointerEndPress() { Debug.Log("OnPointerEndPress"); } /// /// 近距离或射线操作时,触发了一次Button点击 /// public virtual void OnPointerClicked() { Debug.Log("OnPointerClicked"); } /// /// 近距离或射线操作时,近距离操作时用户食指指尖离开了Button上方或者离开了Button上方,射线操作时离开了Button上表面 /// public virtual void OnPointerHoverExit() { Debug.Log("OnPointerHoverExit"); SpatialUIEventSystem.Instance.CurrentHoverSpatialUIElement = null; } #endregion } }