SpatialSelectable.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using EZXR.Glass.Inputs;
  5. namespace EZXR.Glass.UI
  6. {
  7. public abstract class SpatialSelectable : SpatialUIElement
  8. {
  9. /// <summary>
  10. /// 是否启用导航
  11. /// </summary>
  12. public bool navigation;
  13. /// <summary>
  14. /// 当此元素出现时将作为当前被选中的元素继续进行导航
  15. /// </summary>
  16. public bool beFocusedWhenEnabled;
  17. /// <summary>
  18. /// 在此元素被设为被选中元素时,记录之前被选中的元素,以便此元素被Disabled的时候将focus权交会
  19. /// </summary>
  20. SpatialSelectable lastFocusedElement;
  21. public SpatialSelectable navigationUp;
  22. public SpatialSelectable navigationDown;
  23. public SpatialSelectable navigationLeft;
  24. public SpatialSelectable navigationRight;
  25. public abstract void OnRayCastHit(InputInfoBase handInfo);
  26. protected override void OnEnable()
  27. {
  28. base.OnEnable();
  29. if (Application.isPlaying)
  30. {
  31. if (beFocusedWhenEnabled)
  32. {
  33. lastFocusedElement = SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement;
  34. SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement = this;
  35. SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement.OnPointerHoverEnter();
  36. }
  37. }
  38. }
  39. protected override void OnDisable()
  40. {
  41. base.OnDisable();
  42. if (SpatialUIEventSystem.Instance != null && SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement != null && lastFocusedElement != null)
  43. {
  44. SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement.OnPointerHoverExit();
  45. if (beFocusedWhenEnabled)
  46. {
  47. SpatialUIEventSystem.Instance.CurrentFocusSpatialUIElement = lastFocusedElement;
  48. lastFocusedElement = null;
  49. }
  50. }
  51. }
  52. #region Pointer Event
  53. /// <summary>
  54. /// 近距离或射线操作时,近距离操作时用户食指指尖进入了Button上方或者离开了Button上方,射线操作时触碰到了Button上表面
  55. /// </summary>
  56. public virtual void OnPointerHoverEnter(Spatial.InteractiveMode interactiveMode = Spatial.InteractiveMode.None)
  57. {
  58. Debug.Log("OnPointerHoverEnter");
  59. if (SpatialUIEventSystem.Instance.CurrentHoverSpatialUIElement != null)
  60. {
  61. SpatialUIEventSystem.Instance.CurrentHoverSpatialUIElement.OnPointerHoverExit();
  62. }
  63. SpatialUIEventSystem.Instance.CurrentHoverSpatialUIElement = this;
  64. }
  65. /// <summary>
  66. /// 近距离操作时,指尖触碰到了Button上表面时触发;远距离操作时,射线在Button上捏合手指时触发,将会同时顺序触发OnPointerStartPress和OnPointerDown)
  67. /// </summary>
  68. public virtual void OnPointerStartPress()
  69. {
  70. Debug.Log("OnPointerStartPress");
  71. }
  72. /// <summary>
  73. /// 近距离或射线操作时,近距离操作时Button被按下但是没有到底时触发(每帧),射线操作时Button被按下时触发(每帧)
  74. /// </summary>
  75. public virtual void OnPointerPressing()
  76. {
  77. //Debug.Log("OnPointerPressing");
  78. }
  79. /// <summary>
  80. /// 近距离或射线操作时,Button被按到底时触发(对于射线,将会同时顺序触发OnPointerStartPress和OnPointerDown)
  81. /// </summary>
  82. public virtual void OnPointerDown()
  83. {
  84. Debug.Log("OnPointerDown");
  85. }
  86. /// <summary>
  87. /// 近距离或射线操作时,Button被完全松开时触发(对于射线,将会同时顺序触发OnPointerUp和OnPointerEndPress)
  88. /// </summary>
  89. public virtual void OnPointerUp()
  90. {
  91. Debug.Log("OnPointerUp");
  92. }
  93. /// <summary>
  94. /// 近距离或射线操作时,指尖或射线离开了Button上表面(对于射线,将会同时顺序触发OnPointerUp和OnPointerEndPress)
  95. /// </summary>
  96. public virtual void OnPointerEndPress()
  97. {
  98. Debug.Log("OnPointerEndPress");
  99. }
  100. /// <summary>
  101. /// 近距离或射线操作时,触发了一次Button点击
  102. /// </summary>
  103. public virtual void OnPointerClicked()
  104. {
  105. Debug.Log("OnPointerClicked");
  106. }
  107. /// <summary>
  108. /// 近距离或射线操作时,近距离操作时用户食指指尖离开了Button上方或者离开了Button上方,射线操作时离开了Button上表面
  109. /// </summary>
  110. public virtual void OnPointerHoverExit()
  111. {
  112. Debug.Log("OnPointerHoverExit");
  113. SpatialUIEventSystem.Instance.CurrentHoverSpatialUIElement = null;
  114. }
  115. #endregion
  116. }
  117. }