Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }
Exemplo n.º 4
0
 private void CheckHideController(VRTK_InteractableObject touchedObjectScript)
 {
     updatedHideControllerOnTouch = touchedObjectScript.CheckHideMode(hideControllerOnTouch, touchedObjectScript.hideControllerOnTouch);
     if (controllerActions.IsControllerVisible() && updatedHideControllerOnTouch)
     {
         Invoke("HideController", hideControllerDelay);
     }
 }
Exemplo n.º 5
0
        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);
                }
            }
        }
Exemplo n.º 6
0
        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);
                }
            }
        }