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 = "扳机键-使用"; /// /// 操作物 /// private Transform operationGo; /// /// 流程手柄管理 /// private HandHintManager handHintManager; /// /// /// /// 工具 /// 操作物提 /// 是否使用扳机 public void InitInteractable(VRTK_InteractableObject interactable, Transform OpHandHintPoint, bool isUseTrigger = true) { RemoveInteractable(); handHintManager = GetComponent(); this.interactable = interactable; this.triggerTool = interactable.GetComponent(); 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().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); } } /// /// 抓取状态下的触发区域-提示检测 /// /// 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_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); } } } }