ProgressLaserBeam.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using FfalconXR.InputModule;
  2. using System;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.XR;
  6. public class ProgressLaserBeam : LaserBeam
  7. {
  8. /// <summary>
  9. /// 被hover的obj保存一下.
  10. /// </summary>
  11. private GameObject m_HoverObj;
  12. private IPointerClickHandler m_PointerHandler;
  13. private IDragHandler m_DragHandler;
  14. public Material m_progressMat;
  15. /// <summary>
  16. /// 进度条的renderer
  17. /// </summary>
  18. private MeshRenderer m_ProgressRenderer;
  19. /// <summary>
  20. /// 进度条内部和圆圈外部的距离
  21. /// </summary>
  22. [SerializeField]
  23. private float m_ProgressInnerDiameterOffset = 1;
  24. /// <summary>
  25. /// 进度条外部和圆圈外部的距离
  26. /// </summary>
  27. [SerializeField]
  28. private float m_ProgressOuterDiameterOffset = 4;
  29. /// <summary>
  30. /// 进度条速度
  31. /// </summary>
  32. [SerializeField]
  33. private int m_ProgressSpeed = 10;
  34. private int m_MaxProgressValue = 360;
  35. /// <summary>
  36. /// 当前进度条值
  37. /// </summary>
  38. private int m_CurProgressValue;
  39. /// <summary>
  40. /// 进度条跑完了,是否已经发射了.
  41. /// </summary>
  42. private bool m_ProgressClickActionShooted = false;
  43. private RaycastResult m_raycastResult;
  44. PointerEventData m_PointerEventData;
  45. protected new void Start()
  46. {
  47. base.Start();
  48. if (m_LaserBeamDot == null)
  49. {
  50. return;
  51. }
  52. m_PointerEventData = new PointerEventData(EventSystem.current);
  53. m_PointerEventData.button = PointerEventData.InputButton.Left;
  54. GameObject progressGo = new GameObject("ProgressDot");
  55. progressGo.transform.SetParent(m_LaserBeamDot.parent);
  56. progressGo.transform.localPosition = Vector3.zero;
  57. progressGo.transform.localScale = Vector3.one;
  58. progressGo.transform.localRotation = Quaternion.Euler(0, 0, 0);
  59. m_ProgressRenderer = progressGo.AddComponent<MeshRenderer>();
  60. m_ProgressRenderer.material = m_progressMat;
  61. MeshFilter mf = progressGo.AddComponent<MeshFilter>();
  62. m_ProgressRenderer.sortingOrder = m_SortingOrder;
  63. CreateReticleVertices(mf);
  64. }
  65. private new void Update()
  66. {
  67. base.Update();
  68. UpdateProgress(m_OuterDiameter * m_Dis, m_Dis);
  69. }
  70. public override void OnPointerEnter(RaycastResult raycastResult, GameObject interactiveObj)
  71. {
  72. m_HoverObj = interactiveObj;
  73. //通知点击.
  74. m_PointerHandler = m_HoverObj.GetComponent<IPointerClickHandler>();
  75. m_DragHandler = m_HoverObj.GetComponent<IDragHandler>();
  76. m_raycastResult = raycastResult;
  77. //m_RunProgress = true;
  78. m_ProgressClickActionShooted = false;
  79. m_CurProgressValue = 0;
  80. m_ProgressRenderer.material.SetFloat("_Progress", m_CurProgressValue);
  81. base.OnPointerEnter(raycastResult, interactiveObj);
  82. }
  83. public override void OnPointerExit(GameObject previousObject)
  84. {
  85. m_HoverObj = null;
  86. m_DragHandler = null;
  87. m_PointerHandler = null;
  88. base.OnPointerExit(previousObject);
  89. }
  90. public void UpdateProgress(float outerDiameter, float distance)
  91. {
  92. if (m_ProgressRenderer == null)
  93. {
  94. return;
  95. }
  96. //if (!m_openProgress || !m_RunProgress)
  97. if (m_HoverObj == null)
  98. {
  99. m_ProgressRenderer.gameObject.SetActive(false);
  100. return;
  101. }
  102. m_ProgressRenderer.gameObject.SetActive(!m_ProgressClickActionShooted);
  103. if (m_ProgressRenderer == null)
  104. {
  105. return;
  106. }
  107. m_ProgressRenderer.material.SetFloat("_InnerDiameter", outerDiameter + m_ProgressInnerDiameterOffset);
  108. m_ProgressRenderer.material.SetFloat("_OuterDiameter", outerDiameter + m_ProgressOuterDiameterOffset);
  109. m_ProgressRenderer.material.SetFloat("_DistanceInMeters", distance);
  110. if (m_CurProgressValue > m_MaxProgressValue)
  111. {
  112. m_PointerEventData.position =
  113. #if UNITY_EDITOR
  114. new Vector2(Screen.width / 2, Screen.height / 2);
  115. #else
  116. new Vector2(XRSettings.eyeTextureWidth / 2, XRSettings.eyeTextureHeight / 2);
  117. #endif
  118. if (m_PointerHandler != null && !m_ProgressClickActionShooted)
  119. {
  120. m_PointerHandler.OnPointerClick(m_PointerEventData);
  121. }
  122. if (m_DragHandler != null)
  123. {
  124. m_PointerEventData.pointerPressRaycast = m_raycastResult;
  125. m_DragHandler.OnDrag(m_PointerEventData);
  126. }
  127. m_ProgressClickActionShooted = true;
  128. }
  129. else
  130. {
  131. m_ProgressRenderer.material.SetFloat("_Progress", m_CurProgressValue += m_ProgressSpeed);
  132. }
  133. }
  134. }