CanvasHandler.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using EZXR.Glass.Inputs;
  2. using EZXR.Glass.SixDof;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. namespace EZXR.Glass.Inputs
  7. {
  8. public class CanvasHandler : MonoBehaviour
  9. {
  10. /// <summary>
  11. /// 所有可交互的canvas
  12. /// </summary>
  13. public static List<Canvas> canvases = new List<Canvas>();
  14. public bool canvasCollider = true;
  15. /// <summary>
  16. /// 两次点击的最小时间间隔
  17. /// </summary>
  18. float clickInterval = 0.2f;
  19. /// <summary>
  20. /// 上次点击的时刻
  21. /// </summary>
  22. float timer_LastClick;
  23. private Camera eventCamera;
  24. private bool startPinchChanged = false;
  25. private bool endPinchChanged = false;
  26. private void Awake()
  27. {
  28. eventCamera = Application.isEditor ? HMDPoseTracker.Instance.centerCamera : HMDPoseTracker.Instance.leftCamera;
  29. Canvas canvas = GetComponent<Canvas>();
  30. canvas.renderMode = UnityEngine.RenderMode.WorldSpace;
  31. canvas.worldCamera = eventCamera;
  32. canvases.Add(canvas);
  33. }
  34. private void OnDestroy()
  35. {
  36. if (canvases != null)
  37. canvases.Clear();
  38. }
  39. private void OnEnable()
  40. {
  41. if (canvasCollider)
  42. {
  43. var depth = 0.02f / transform.localScale.z;
  44. var sizeDelta = gameObject.GetComponent<RectTransform>().sizeDelta;
  45. if (gameObject.GetComponent<BoxCollider>() == null)
  46. {
  47. gameObject.AddComponent<BoxCollider>().size = new Vector3(sizeDelta.x, sizeDelta.y, depth);
  48. gameObject.GetComponent<BoxCollider>().center = new Vector3(0, 0, 0.005f);
  49. //canvas.gameObject.GetComponent<BoxCollider>().isTrigger = true;
  50. }
  51. else
  52. {
  53. gameObject.GetComponent<BoxCollider>().size = new Vector3(sizeDelta.x, sizeDelta.y, depth);
  54. gameObject.GetComponent<BoxCollider>().center = new Vector3(0, 0, 0.005f);
  55. //canvas.gameObject.GetComponent<BoxCollider>().isTrigger = true;
  56. }
  57. }
  58. }
  59. private void Update()
  60. {
  61. if (timer_LastClick < clickInterval)
  62. {
  63. timer_LastClick += Time.deltaTime;
  64. }
  65. else
  66. {
  67. UpdatePinching();
  68. }
  69. }
  70. /// <summary>
  71. /// 手势(食指尖)触摸Enter
  72. /// </summary>
  73. /// <param name="other">(食)指尖Collider</param>
  74. private void OnTriggerEnter(Collider other)
  75. {
  76. Debug.Log($"CanvasTouchHandler, OnTriggerEnter {other.name} ({Time.frameCount})");
  77. if (timer_LastClick >= clickInterval)
  78. {
  79. if (other.name.Contains("Left_Index_4"))
  80. {
  81. float angle = Vector3.Dot(Vector3.Project(other.transform.position - transform.position, -transform.forward).normalized, -transform.forward);
  82. Debug.Log("the angle: " + angle);
  83. if (1 - angle < 0.1f)
  84. {
  85. startPinchChanged = true;
  86. InputSystem.leftHand.isCloseContactingUGUI = true;
  87. //InputSystem.leftHand.RaycastInteraction = false;
  88. }
  89. }
  90. else if (other.name.Contains("Right_Index_4"))
  91. {
  92. float angle = Vector3.Dot(Vector3.Project(other.transform.position - transform.position, -transform.forward).normalized, -transform.forward);
  93. Debug.Log("the angle: " + angle);
  94. if (1 - angle < 0.1f)
  95. {
  96. startPinchChanged = true;
  97. InputSystem.rightHand.isCloseContactingUGUI = true;
  98. //InputSystem.rightHand.RaycastInteraction = false;
  99. }
  100. }
  101. }
  102. }
  103. /// <summary>
  104. /// 手势(食指尖)触摸Exit
  105. /// </summary>
  106. /// <param name="other">(食)指尖Collider</param>
  107. private void OnTriggerExit(Collider other)
  108. {
  109. Debug.Log($"CanvasTouchHandler, OnTriggerExit {other.name} ({Time.frameCount})");
  110. if (timer_LastClick >= clickInterval)
  111. {
  112. if (other.name.Contains("Left_Index_4"))
  113. {
  114. endPinchChanged = true;
  115. //ControllerManager.leftHand.isCloseContactingUGUI = false;
  116. }
  117. else if (other.name.Contains("Right_Index_4"))
  118. {
  119. endPinchChanged = true;
  120. //ControllerManager.rightHand.isCloseContactingUGUI = false;
  121. }
  122. }
  123. }
  124. private void UpdatePinching()
  125. {
  126. if (InputSystem.leftHand.isCloseContactingUGUI)
  127. {
  128. if (InputSystem.leftHand.startPinch)
  129. InputSystem.leftHand.startPinch = false;
  130. if (InputSystem.leftHand.endPinch)
  131. {
  132. InputSystem.leftHand.endPinch = false;
  133. InputSystem.leftHand.isCloseContactingUGUI = false;
  134. }
  135. }
  136. if (InputSystem.rightHand.isCloseContactingUGUI)
  137. {
  138. if (InputSystem.rightHand.startPinch)
  139. InputSystem.rightHand.startPinch = false;
  140. if (InputSystem.rightHand.endPinch)
  141. {
  142. InputSystem.rightHand.endPinch = false;
  143. InputSystem.rightHand.isCloseContactingUGUI = false;
  144. }
  145. }
  146. if (startPinchChanged)
  147. {
  148. startPinchChanged = false;
  149. if (InputSystem.leftHand.isCloseContactingUGUI)
  150. InputSystem.leftHand.startPinch = true;
  151. if (InputSystem.rightHand.isCloseContactingUGUI)
  152. InputSystem.rightHand.startPinch = true;
  153. }
  154. if (endPinchChanged)
  155. {
  156. endPinchChanged = false;
  157. if (InputSystem.leftHand.isCloseContactingUGUI)
  158. {
  159. InputSystem.leftHand.endPinch = true;
  160. InputSystem.leftHand.isCloseContactingUGUI = false;
  161. //InputSystem.leftHand.enableRayInteraction = true; //未起作用
  162. }
  163. if (InputSystem.rightHand.isCloseContactingUGUI)
  164. {
  165. InputSystem.rightHand.endPinch = true;
  166. InputSystem.rightHand.isCloseContactingUGUI = false;
  167. //InputSystem.rightHand.enableRayInteraction = true; //未起作用
  168. }
  169. timer_LastClick = 0;
  170. Debug.Log("endPinchChanged reset");
  171. }
  172. }
  173. }
  174. }