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);
}
}
}
}