private void OnTriggerStay(Collider collider) { if (touchedObject == null && IsObjectInteractable(collider.gameObject)) { if (collider.gameObject.GetComponent <VRTK_InteractableObject>()) { touchedObject = collider.gameObject; } else { touchedObject = collider.gameObject.GetComponentInParent <VRTK_InteractableObject>().gameObject; } OnControllerTouchInteractableObject(SetControllerInteractEvent(touchedObject)); touchedObject.GetComponent <VRTK_InteractableObject>().ToggleHighlight(true, globalTouchHighlightColor); touchedObject.GetComponent <VRTK_InteractableObject>().StartTouching(this.gameObject); if (controllerActions.IsControllerVisible() && hideControllerOnTouch) { Invoke("HideController", hideControllerDelay); } var rumbleAmount = touchedObject.GetComponent <VRTK_InteractableObject>().rumbleOnTouch; if (!rumbleAmount.Equals(Vector2.zero)) { controllerActions.TriggerHapticPulse((ushort)rumbleAmount.y, (int)rumbleAmount.x, 0.05f); } } }
private void OnTriggerStay(Collider collider) { if (!enabled) { return; } if (touchedObject != null && touchedObject != lastTouchedObject && !touchedObject.GetComponent <VRTK_InteractableObject>().IsGrabbed()) { // 如果当前触碰物体不为空,并且和最新的触碰对象不一样,且此物体还没有被抓取,那么手柄应该触碰最新的进入范围的游戏对象 CancelInvoke("ResetTriggerRumble"); // 取消ResetTriggerRumble调用 ResetTriggerRumble(); // 调用ResetTriggerRumble ForceStopTouching(); // 停止触碰当前的触碰物体,touchedObject = null } if (touchedObject == null && IsObjectInteractable(collider.gameObject)) { // 如果当前没有正在触碰的物体且进入范围的碰撞器对应的游戏对象可以交互 // 将停留在范围内的碰撞器对应的游戏对象作为当前触碰对象和最新触碰对象 touchedObject = GetColliderInteractableObject(collider); lastTouchedObject = touchedObject; var touchedObjectScript = touchedObject.GetComponent <VRTK_InteractableObject>(); if (!touchedObjectScript.IsValidInteractableController(gameObject, touchedObjectScript.allowedTouchControllers)) { // 如果新进来的物体不允许与当前手柄交互,那么就不能交互 touchedObject = null; return; } // 是否隐藏手柄 updatedHideControllerOnTouch = touchedObjectScript.CheckHideMode(hideControllerOnTouch, touchedObjectScript.hideControllerOnTouch); // 发送事件,回调委托给ControllerTouchInteractableObject的方法,参数为touchedObject OnControllerTouchInteractableObject(SetControllerInteractEvent(touchedObject)); // 让可交互物体开启高亮 touchedObjectScript.ToggleHighlight(true, globalTouchHighlightColor); touchedObjectScript.StartTouching(gameObject); if (controllerActions.IsControllerVisible() && updatedHideControllerOnTouch) { // 如果当前手柄可见并且设定触碰时隐藏,就调用HideController方法 Invoke("HideController", hideControllerDelay); } // 处理手柄上的震动反馈,需要controllerActions // 从物体上的脚本获取震动数据 var rumbleAmount = touchedObjectScript.rumbleOnTouch; if (!rumbleAmount.Equals(Vector2.zero) && !triggerRumble) { // 如果震动不为0,并且还没有震动,就开始震动 triggerRumble = true; controllerActions.TriggerHapticPulse((ushort)rumbleAmount.y, rumbleAmount.x, 0.05f); // rumbleAmount.x秒后停止震动 Invoke("ResetTriggerRumble", rumbleAmount.x); } } }
private void UseInteractedObject(GameObject touchedObject) { if ((usingObject == null || usingObject != touchedObject) && IsObjectUsable(touchedObject)) { usingObject = touchedObject; var usingObjectScript = usingObject.GetComponent <VRTK_InteractableObject>(); if (!usingObjectScript.IsValidInteractableController(gameObject, usingObjectScript.allowedUseControllers)) { usingObject = null; return; } updatedHideControllerOnUse = usingObjectScript.CheckHideMode(hideControllerOnUse, usingObjectScript.hideControllerOnUse); currentControllerHideState = controllerActions.IsControllerVisible(); OnControllerUseInteractableObject(interactTouch.SetControllerInteractEvent(usingObject)); usingObjectScript.StartUsing(gameObject); if (updatedHideControllerOnUse) { Invoke("HideController", hideControllerDelay); } else { controllerActions.ToggleControllerModel(true, usingObject); } var rumbleAmount = usingObjectScript.rumbleOnUse; if (!rumbleAmount.Equals(Vector2.zero)) { controllerActions.TriggerHapticPulse((ushort)rumbleAmount.y, rumbleAmount.x, 0.05f); } } }
private void CheckHideController(VRTK_InteractableObject touchedObjectScript) { updatedHideControllerOnTouch = touchedObjectScript.CheckHideMode(hideControllerOnTouch, touchedObjectScript.hideControllerOnTouch); if (controllerActions.IsControllerVisible() && updatedHideControllerOnTouch) { Invoke("HideController", hideControllerDelay); } }
private void OnTriggerStay(Collider collider) { if (!enabled) { return; } if (touchedObject != null && touchedObject != lastTouchedObject && touchedObject != collider.gameObject && !touchedObject.GetComponent <VRTK_InteractableObject>().IsGrabbed()) { CancelInvoke("ResetTriggerRumble"); ResetTriggerRumble(); ForceStopTouching(); } if (touchedObject == null && IsObjectInteractable(collider.gameObject)) { touchedObject = GetColliderInteractableObject(collider); lastTouchedObject = touchedObject; var touchedObjectScript = touchedObject.GetComponent <VRTK_InteractableObject>(); if (!touchedObjectScript.IsValidInteractableController(gameObject, touchedObjectScript.allowedTouchControllers)) { touchedObject = null; return; } CheckButtonOverrides(touchedObjectScript); updatedHideControllerOnTouch = touchedObjectScript.CheckHideMode(hideControllerOnTouch, touchedObjectScript.hideControllerOnTouch); OnControllerTouchInteractableObject(SetControllerInteractEvent(touchedObject)); touchedObjectScript.ToggleHighlight(true, globalTouchHighlightColor); touchedObjectScript.StartTouching(gameObject); if (controllerActions.IsControllerVisible() && updatedHideControllerOnTouch) { Invoke("HideController", hideControllerDelay); } var rumbleAmount = touchedObjectScript.rumbleOnTouch; if (!rumbleAmount.Equals(Vector2.zero) && !triggerRumble) { triggerRumble = true; controllerActions.TriggerHapticPulse((ushort)rumbleAmount.y, rumbleAmount.x, 0.05f); Invoke("ResetTriggerRumble", rumbleAmount.x); } } }
private void OnTriggerStay(Collider collider) { if (touchedObject != null && touchedObject != lastTouchedObject && !touchedObject.GetComponent <VRTK_InteractableObject>().IsGrabbed()) { ForceStopTouching(); } if (touchedObject == null && IsObjectInteractable(collider.gameObject)) { if (collider.gameObject.GetComponent <VRTK_InteractableObject>()) { touchedObject = collider.gameObject; } else { touchedObject = collider.gameObject.GetComponentInParent <VRTK_InteractableObject>().gameObject; } var touchedObjectScript = touchedObject.GetComponent <VRTK_InteractableObject>(); if (!touchedObjectScript.IsValidInteractableController(this.gameObject, touchedObjectScript.allowedTouchControllers)) { touchedObject = null; return; } OnControllerTouchInteractableObject(SetControllerInteractEvent(touchedObject)); touchedObjectScript.ToggleHighlight(true, globalTouchHighlightColor); touchedObjectScript.StartTouching(this.gameObject); if (controllerActions.IsControllerVisible() && hideControllerOnTouch) { Invoke("HideController", hideControllerDelay); } var rumbleAmount = touchedObjectScript.rumbleOnTouch; if (!rumbleAmount.Equals(Vector2.zero) && !triggerRumble) { triggerRumble = true; controllerActions.TriggerHapticPulse((ushort)rumbleAmount.y, rumbleAmount.x, 0.05f); Invoke("ResetTriggerRumble", rumbleAmount.x); } } }
private void OnTriggerStay(Collider collider) { if (touchedObject == null && IsObjectInteractable(collider.gameObject)) { if (collider.gameObject.GetComponent <VRTK_InteractableObject>()) { touchedObject = collider.gameObject; } else { touchedObject = collider.gameObject.GetComponentInParent <VRTK_InteractableObject>().gameObject; } OnControllerTouchInteractableObject(SetControllerInteractEvent(touchedObject)); touchedObject.GetComponent <VRTK_InteractableObject>().ToggleHighlight(true, globalTouchHighlightColor); touchedObject.GetComponent <VRTK_InteractableObject>().StartTouching(this.gameObject); if (controllerActions.IsControllerVisible() && hideControllerOnTouch) { Invoke("HideController", hideControllerDelay); } } }