using UnityEngine; using ChivaXR.Op; using EPOOutline; namespace ChivaXR.VR { public enum HintType { highlighter, Other } public class CVR_HintItem : MonoBehaviour { private IVR_Interactable interactable; public HintType hintType = HintType.Other; public bool isHint = false; public CVR_HintItem childHint; void Awake() { InitInteractable(); InitHintMode(); } public void OpenHint(GameObject childObject = null) { if (isHint) return; if (interactable != null) { RegisterInteractableEvent(); if (childObject != null) { CVR_HintItem tempChildHint = childObject.GetComponent() == null ? childObject.AddComponent() : childObject.GetComponent(); this.childHint = tempChildHint; } if (interactable.CVR_IsGrabbed()) { CloseHintSelf(); if (childHint != null) childHint.OpenHint(); } else { OpenHintSelf(); } } else { OpenHintSelf(); } isHint = true; } public void CloseHint() { if (interactable != null) { UnRegisterInteractableEvent(); if (childHint != null) { this.childHint.CloseHint(); this.childHint = null; } } isHint = false; CloseHintSelf(); } public void RefrushCurrentHintActive() { if (CVR_HintManager.Instance.IsActive) { OpenHintSelf(); } else { CloseHintSelf(); } } #region private private void InitInteractable() { this.interactable = this.GetComponent(); } private void RegisterInteractableEvent() { this.interactable.CVR_InteractableObjectGrabbed += Controller_CVR_InteractableGrabAndUsed; this.interactable.CVR_InteractableObjectUsed += Controller_CVR_InteractableGrabAndUsed; this.interactable.CVR_InteractableObjectPreUnGrabbed += Controller_CVR_InteractableUngrab; } private void UnRegisterInteractableEvent() { this.interactable.CVR_InteractableObjectGrabbed -= Controller_CVR_InteractableGrabAndUsed; this.interactable.CVR_InteractableObjectUsed -= Controller_CVR_InteractableGrabAndUsed; this.interactable.CVR_InteractableObjectPreUnGrabbed -= Controller_CVR_InteractableUngrab; } /// /// 初始化提示模式 /// private void InitHintMode() { switch (hintType) { case HintType.highlighter: InitHighlighterMode(); break; case HintType.Other: InitHighlighterMode(); break; } } /// /// 拿起工具,关闭高亮提示 /// /// /// private void Controller_CVR_InteractableGrabAndUsed(object sender, CVR_InteractableObjectEventArgs e) { CloseHintSelf(); if (childHint != null) { childHint.OpenHint(); } } /// /// 放下工具,开启工具高亮提示 /// /// /// private void Controller_CVR_InteractableUngrab(object sender, CVR_InteractableObjectEventArgs e) { if (childHint != null) { childHint.CloseHint(); } OpenHintSelf(); } private void OpenHintSelf() { if (!CVR_HintManager.Instance.IsActive) return; switch (hintType) { case HintType.highlighter: OpenHighlighter(OutLineType.hint); break; case HintType.Other: //箭头加高亮 OpenHintObjMode(); break; } } private void CloseHintSelf() { switch (hintType) { case HintType.highlighter: CloseHighLighter(); break; case HintType.Other: CloseHintObjMode(); CloseHighLighter(); break; } } #endregion #region Hightlighter Mode private Outlinable outLinable; private Color hoverColor; /// /// 初始化高亮提示模式 /// /// 工具提示 /// 操作点提示 public void InitHighlighterMode() { outLinable = GetComponent() == null ? gameObject.AddComponent() : gameObject.GetComponent(); outLinable.enabled = false; hoverColor = CVR_HintManager.Instance.hoverColor; } /// /// 打开高亮 /// /// public void OpenHighlighter(OutLineType outLineType) { OutLineManager.Instance.ResetOutLinableByType(outLinable, outLineType); outLinable.enabled = true; } /// /// 关闭高亮 /// private void CloseHighLighter() { outLinable.enabled = false; } #endregion #region Other public void OpenHintObjMode() { if (ExamManagerForVR.instance != null) { ExamManagerForVR.instance.hintItem = this; if (JianTouManager.instance != null && JianTouManager.instance.active) OpenHighlighter(OutLineType.hint); } else OpenHighlighter(OutLineType.hint); if (transform.Find("HintPoint")) JianTouManager.Instance.ShowJianTou(transform.Find("HintPoint")); else JianTouManager.Instance.ShowJianTou(this.transform); } public void CloseHintObjMode() { JianTouManager.Instance.HideJianTou(); } #endregion } }