123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- using ChivaXR.VR;
- using UnityEngine;
- using VRTK;
- public class InteractableHandHint : MonoBehaviour
- {
- private VRTK_InteractableObject interactable;
- private CVR_TriggerTool triggerTool;
- private SDK_BaseController.ControllerHand currentTouchHand;
- private bool isUseTrigger = true;
- public string gripInfo_Hold = "侧键-放下";
- public string gripInfo_No = "侧键-拾取";
- public string triggerInfo = "扳机键-使用";
- /// <summary>
- /// 操作物
- /// </summary>
- private Transform operationGo;
- /// <summary>
- /// 流程手柄管理
- /// </summary>
- private HandHintManager handHintManager;
- /// <summary>
- ///
- /// </summary>
- /// <param name="interactable">工具</param>
- /// <param name="OpHandHintPoint">操作物提</param>
- /// <param name="isUseTrigger">是否使用扳机</param>
- public void InitInteractable(VRTK_InteractableObject interactable, Transform OpHandHintPoint, bool isUseTrigger = true)
- {
- RemoveInteractable();
- handHintManager = GetComponent<HandHintManager>();
- this.interactable = interactable;
- this.triggerTool = interactable.GetComponent<CVR_TriggerTool>();
- this.operationGo = OpHandHintPoint;
- this.isUseTrigger = isUseTrigger;
- if (interactable == null || OpHandHintPoint == null)
- {
- return;
- }
- interactable.InteractableObjectGrabbed += Grab;
- interactable.InteractableObjectUngrabbed += UnGrab;
- interactable.InteractableObjectUsed += Use;
- interactable.InteractableObjectUnused += UnUse;
- }
- public void RemoveInteractable()
- {
- if (interactable == null) return;
- if (interactable.IsGrabbed())
- {
- HandHintController.GetInstance().ShowHandHint(currentTouchHand, SDK_BaseController.ButtonTypes.Grip);
- HandHintController.GetInstance().UpdateToolTipsText(currentTouchHand, SDK_BaseController.ButtonTypes.Grip, gripInfo_Hold);
- handHintManager.OperationHintState(operationGo, false);
- LearningUIController.Instance.SetText("");
- }
- HandHintController.GetInstance().CloseHandHint(currentTouchHand, SDK_BaseController.ButtonTypes.Trigger);
- interactable.InteractableObjectGrabbed -= Grab;
- interactable.InteractableObjectUngrabbed -= UnGrab;
- interactable.InteractableObjectUsed -= Use;
- interactable.InteractableObjectUnused -= UnUse;
- interactable = null;
- triggerTool = null;
- operationGo = null;
- }
- public void Grab(object sender, InteractableObjectEventArgs e)
- {
- if (operationGo != null)
- {
- handHintManager.OperationHintState(operationGo,true);
- handHintManager.HandHintState(false, Vector3.zero);
- }
- currentTouchHand = interactable.GetComponent<InteractableHintElement>().currentTouchHand;
- HandHintController.GetInstance().CloseHandHint(currentTouchHand, SDK_BaseController.ButtonTypes.Grip);
- }
- public void UnGrab(object sender, InteractableObjectEventArgs e)
- {
- if (isUseTrigger)
- {
- if (interactable != null)
- handHintManager.HandHintState(true, interactable.transform.position);
- }
- }
- /// <summary>
- /// 抓取状态下的触发区域-提示检测
- /// </summary>
- /// <param name="state"></param>
- private void TriggerHint_RangeCheck(bool state)
- {
- if (state)
- {
- HandHintController.GetInstance().ShowHandHint(currentTouchHand, SDK_BaseController.ButtonTypes.Trigger);
- LearningUIController.Instance.SetText("请按扳机键,使用工具");
- }
- else
- {
- HandHintController.GetInstance().CloseHandHint(currentTouchHand, SDK_BaseController.ButtonTypes.Trigger);
- LearningUIController.Instance.SetText("请移动工具到操作指示位置");
- }
- }
- public void Use(object sender, InteractableObjectEventArgs e)
- {
- if (triggerTool == null) return;
- if (Vector3.Distance(triggerTool.triggerPoint.position, operationGo.position) >= triggerTool.triggerRange)
- {
- return;
- }
- handHintManager.OperationHintState(operationGo,false);
- var type = interactable.GetComponent<CVR_ToolTypeFlags>().CVR_ToolType;
- switch (type)
- {
- case CVR_ToolType.扳手01:
- LearningUIController.Instance.SetText("请扣动扳机,使用扳手拆卸螺丝");
- break;
- }
- handHintManager.HandHintState(false, interactable.transform.position);
- }
- public void UnUse(object sender, InteractableObjectEventArgs e)
- {
- handHintManager.OperationHintState(operationGo, true);
- HandHintController.GetInstance().CloseHandHint(currentTouchHand, SDK_BaseController.ButtonTypes.Trigger);
- interactable=null;
- }
- void Update()
- {
- if (interactable == null) return;
- if (!interactable.IsGrabbed()) return;
- if (!interactable.IsUsing() && triggerTool != null)
- {
- if (Vector3.Distance(triggerTool.triggerPoint.position, operationGo.position) <= triggerTool.triggerRange)
- {
- TriggerHint_RangeCheck(true);
- }
- else
- {
- TriggerHint_RangeCheck(false);
- }
- }
- }
- }
|