CVR_HintItem.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. using UnityEngine;
  2. using ChivaXR.Op;
  3. using EPOOutline;
  4. namespace ChivaXR.VR
  5. {
  6. public enum HintType
  7. {
  8. highlighter,
  9. Other
  10. }
  11. public class CVR_HintItem : MonoBehaviour
  12. {
  13. private IVR_Interactable interactable;
  14. public HintType hintType = HintType.Other;
  15. public bool isHint = false;
  16. public CVR_HintItem childHint;
  17. void Awake()
  18. {
  19. InitInteractable();
  20. InitHintMode();
  21. }
  22. public void OpenHint(GameObject childObject = null)
  23. {
  24. if (isHint) return;
  25. if (interactable != null)
  26. {
  27. RegisterInteractableEvent();
  28. if (childObject != null)
  29. {
  30. CVR_HintItem tempChildHint = childObject.GetComponent<CVR_HintItem>() == null
  31. ? childObject.AddComponent<CVR_HintItem>()
  32. : childObject.GetComponent<CVR_HintItem>();
  33. this.childHint = tempChildHint;
  34. }
  35. if (interactable.CVR_IsGrabbed())
  36. {
  37. CloseHintSelf();
  38. if (childHint != null) childHint.OpenHint();
  39. }
  40. else
  41. {
  42. OpenHintSelf();
  43. }
  44. }
  45. else
  46. {
  47. OpenHintSelf();
  48. }
  49. isHint = true;
  50. }
  51. public void CloseHint()
  52. {
  53. if (interactable != null)
  54. {
  55. UnRegisterInteractableEvent();
  56. if (childHint != null)
  57. {
  58. this.childHint.CloseHint();
  59. this.childHint = null;
  60. }
  61. }
  62. isHint = false;
  63. CloseHintSelf();
  64. }
  65. public void RefrushCurrentHintActive()
  66. {
  67. if (CVR_HintManager.Instance.IsActive)
  68. {
  69. OpenHintSelf();
  70. }
  71. else
  72. {
  73. CloseHintSelf();
  74. }
  75. }
  76. #region private
  77. private void InitInteractable()
  78. {
  79. this.interactable = this.GetComponent<IVR_Interactable>();
  80. }
  81. private void RegisterInteractableEvent()
  82. {
  83. this.interactable.CVR_InteractableObjectGrabbed += Controller_CVR_InteractableGrabAndUsed;
  84. this.interactable.CVR_InteractableObjectUsed += Controller_CVR_InteractableGrabAndUsed;
  85. this.interactable.CVR_InteractableObjectPreUnGrabbed += Controller_CVR_InteractableUngrab;
  86. }
  87. private void UnRegisterInteractableEvent()
  88. {
  89. this.interactable.CVR_InteractableObjectGrabbed -= Controller_CVR_InteractableGrabAndUsed;
  90. this.interactable.CVR_InteractableObjectUsed -= Controller_CVR_InteractableGrabAndUsed;
  91. this.interactable.CVR_InteractableObjectPreUnGrabbed -= Controller_CVR_InteractableUngrab;
  92. }
  93. /// <summary>
  94. /// 初始化提示模式
  95. /// </summary>
  96. private void InitHintMode()
  97. {
  98. switch (hintType)
  99. {
  100. case HintType.highlighter:
  101. InitHighlighterMode();
  102. break;
  103. case HintType.Other:
  104. InitHighlighterMode();
  105. break;
  106. }
  107. }
  108. /// <summary>
  109. /// 拿起工具,关闭高亮提示
  110. /// </summary>
  111. /// <param name="sender"></param>
  112. /// <param name="e"></param>
  113. private void Controller_CVR_InteractableGrabAndUsed(object sender, CVR_InteractableObjectEventArgs e)
  114. {
  115. CloseHintSelf();
  116. if (childHint != null)
  117. {
  118. childHint.OpenHint();
  119. }
  120. }
  121. /// <summary>
  122. /// 放下工具,开启工具高亮提示
  123. /// </summary>
  124. /// <param name="sender"></param>
  125. /// <param name="e"></param>
  126. private void Controller_CVR_InteractableUngrab(object sender, CVR_InteractableObjectEventArgs e)
  127. {
  128. if (childHint != null)
  129. {
  130. childHint.CloseHint();
  131. }
  132. OpenHintSelf();
  133. }
  134. private void OpenHintSelf()
  135. {
  136. if (!CVR_HintManager.Instance.IsActive) return;
  137. switch (hintType)
  138. {
  139. case HintType.highlighter:
  140. OpenHighlighter(OutLineType.hint);
  141. break;
  142. case HintType.Other: //箭头加高亮
  143. OpenHintObjMode();
  144. break;
  145. }
  146. }
  147. private void CloseHintSelf()
  148. {
  149. switch (hintType)
  150. {
  151. case HintType.highlighter:
  152. CloseHighLighter();
  153. break;
  154. case HintType.Other:
  155. CloseHintObjMode();
  156. CloseHighLighter();
  157. break;
  158. }
  159. }
  160. #endregion
  161. #region Hightlighter Mode
  162. private Outlinable outLinable;
  163. private Color hoverColor;
  164. /// <summary>
  165. /// 初始化高亮提示模式
  166. /// </summary>
  167. /// <param name="interactable">工具提示</param>
  168. /// <param name="childGameobject">操作点提示</param>
  169. public void InitHighlighterMode()
  170. {
  171. outLinable = GetComponent<Outlinable>() == null ?
  172. gameObject.AddComponent<Outlinable>()
  173. : gameObject.GetComponent<Outlinable>();
  174. outLinable.enabled = false;
  175. hoverColor = CVR_HintManager.Instance.hoverColor;
  176. }
  177. /// <summary>
  178. /// 打开高亮
  179. /// </summary>
  180. /// <param name="color"></param>
  181. public void OpenHighlighter(OutLineType outLineType)
  182. {
  183. OutLineManager.Instance.ResetOutLinableByType(outLinable, outLineType);
  184. outLinable.enabled = true;
  185. }
  186. /// <summary>
  187. /// 关闭高亮
  188. /// </summary>
  189. private void CloseHighLighter()
  190. {
  191. outLinable.enabled = false;
  192. }
  193. #endregion
  194. #region Other
  195. public void OpenHintObjMode()
  196. {
  197. if (ExamManagerForVR.instance != null)
  198. {
  199. ExamManagerForVR.instance.hintItem = this;
  200. if (JianTouManager.instance != null && JianTouManager.instance.active) OpenHighlighter(OutLineType.hint);
  201. }
  202. else OpenHighlighter(OutLineType.hint);
  203. if (transform.Find("HintPoint"))
  204. JianTouManager.Instance.ShowJianTou(transform.Find("HintPoint"));
  205. else
  206. JianTouManager.Instance.ShowJianTou(this.transform);
  207. }
  208. public void CloseHintObjMode()
  209. {
  210. JianTouManager.Instance.HideJianTou();
  211. }
  212. #endregion
  213. }
  214. }