123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- 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<CVR_HintItem>() == null
- ? childObject.AddComponent<CVR_HintItem>()
- : childObject.GetComponent<CVR_HintItem>();
- 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<IVR_Interactable>();
- }
- 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;
- }
- /// <summary>
- /// 初始化提示模式
- /// </summary>
- private void InitHintMode()
- {
- switch (hintType)
- {
- case HintType.highlighter:
- InitHighlighterMode();
- break;
- case HintType.Other:
- InitHighlighterMode();
- break;
- }
- }
- /// <summary>
- /// 拿起工具,关闭高亮提示
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void Controller_CVR_InteractableGrabAndUsed(object sender, CVR_InteractableObjectEventArgs e)
- {
- CloseHintSelf();
- if (childHint != null)
- {
- childHint.OpenHint();
- }
- }
- /// <summary>
- /// 放下工具,开启工具高亮提示
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- 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;
- /// <summary>
- /// 初始化高亮提示模式
- /// </summary>
- /// <param name="interactable">工具提示</param>
- /// <param name="childGameobject">操作点提示</param>
- public void InitHighlighterMode()
- {
- outLinable = GetComponent<Outlinable>() == null ?
- gameObject.AddComponent<Outlinable>()
- : gameObject.GetComponent<Outlinable>();
- outLinable.enabled = false;
- hoverColor = CVR_HintManager.Instance.hoverColor;
- }
- /// <summary>
- /// 打开高亮
- /// </summary>
- /// <param name="color"></param>
- public void OpenHighlighter(OutLineType outLineType)
- {
- OutLineManager.Instance.ResetOutLinableByType(outLinable, outLineType);
- outLinable.enabled = true;
- }
- /// <summary>
- /// 关闭高亮
- /// </summary>
- 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
- }
- }
|