Example #1
0
    //PROCEDURE ON TRIGGER PRESS
    protected override void OnSelectEnter(XRBaseInteractor interactor)
    {
        selected = true;

        if (interactor.GetComponent <XRController>().controllerNode == handController)
        {
            base.OnSelectEnter(interactor);

            StoreInteractor(interactor);
            MatchAttachmentPoints(interactor);

            if (!audioSelectFlag)
            {
                audioFXSource.PlayOneShot(onButtonPressDown);
                audioSelectFlag = true;
            }

            if (this.gameObject.tag != "Duplicate")
            {
                moveLocomotionScript.moveSpeed = moveSpeedWhileSelected;
                adjustQuadScript.SetAdjustListen(false);
            }
            else
            {
                base.trackRotation = true;
            }

            quadMaterial.SetColor(outlineColorName, selectColorForHandMode);
        }
        else if (interactor.GetComponent <XRController>().controllerNode == joystickController)
        {
            if (!audioSelectFlag)
            {
                audioFXSource.PlayOneShot(onButtonPressDown);
                audioSelectFlag = true;
            }

            moveLocomotionScript.enabled   = false;
            snapTurnProviderScript.enabled = false;

            rotateQuadScript.SetTranslate(true);
            rotateQuadScript.SetRotate(false);

            if (this.gameObject.tag != "Duplicate")
            {
                adjustQuadScript.SetAdjustListen(false);
            }

            quadMaterial.SetColor(outlineColorName, selectColorForJoystickMode);
        }
    }
    IEnumerator SendHapticFeedback(XRBaseInteractor interactor)
    {
        // Interval between iterations of coroutine, in seconds.
        float runInterval = 0.1f;

        ActionBasedController controller = interactor.GetComponent <ActionBasedController>();

        Vector3 lastAngularVelocity = new Vector3(transform.InverseTransformDirection(m_Rigidbody.angularVelocity).x, 0f, 0f);

        while (grabPoint)
        {
            Vector3 currentAngularVelocity = new Vector3(transform.InverseTransformDirection(m_Rigidbody.angularVelocity).x, 0f, 0f);
            Vector3 angularAcceleration    = (currentAngularVelocity - lastAngularVelocity) / runInterval;

            // If current velocity and acceleration have perpendicular or opposite directions, the wheel is decelerating.
            if (Vector3.Dot(currentAngularVelocity.normalized, angularAcceleration.normalized) < 0f)
            {
                float impulseAmplitude = Mathf.Abs(angularAcceleration.x);

                if (impulseAmplitude > 1.5f)
                {
                    float remappedImpulseAmplitude = Remap(impulseAmplitude, 1.5f, 40f, 0f, 1f);

                    controller.SendHapticImpulse(remappedImpulseAmplitude, runInterval * 2f);
                }
            }

            lastAngularVelocity = currentAngularVelocity;
            yield return(new WaitForSeconds(runInterval));
        }
    }
Example #3
0
    private void OnHoverEnter(XRBaseInteractor interactor)
    {
        //TODO: Solve here how to grap the object with two hands to scale!
        if (interactorA == null)
        {
            interactorA      = interactor;
            initialPositionA = interactor.GetComponent <Collider>().transform.position;
        }
        else if (interactorB == null)
        {
            interactorB      = interactor;
            initialPositionB = interactor.GetComponent <Collider>().transform.position;
        }

        originalScale = considerParent ? parentToScale.localScale : transform.localScale;
    }
Example #4
0
 protected override void OnSelectEnter(XRBaseInteractor interactor)
 {
     base.OnSelectEnter(interactor);
     if (interactor is XRDirectInteractor)
     {
         Climber.climbingHand = interactor.GetComponent <XRController>();
     }
 }
Example #5
0
 protected override void OnSelectEntered(XRBaseInteractor interactor)
 {
     base.OnSelectEntered(interactor);
     if (interactor is XRDirectInteractor)
     {
         controller = interactor.GetComponent <ActionBasedController>();
     }
 }
Example #6
0
    private void OnBeginInteraction(XRBaseInteractor interactor)
    {
        currentInteractorTransform = interactor.transform;
        proxyHand.EnableProxyHandVisual(interactor.GetComponent <ActionBasedController>(), interactor);

        //interactor.GetComponent<XRBaseController>().hideControllerModel = true;
        //proxyHand.Activate();
    }
Example #7
0
    //réécrire la fonction OnSelectEntered de XRBaseInteractable
    protected override void OnSelectEntered(XRBaseInteractor interactor)
    {
        base.OnSelectEntered(interactor);

        // si interactor = XRDirectInteractor = une manette
        if (interactor is XRDirectInteractor)
        {
            //envoyer cette manette à climbScript
            climbScript.climbingHand = interactor.GetComponent <XRController>();
        }
    }
Example #8
0
    //réécrire la fonction OnHoverEntered de XRBaseInteractable
    protected override void OnHoverEntered(XRBaseInteractor interactor)
    {
        base.OnHoverEntered(interactor);

        //XRDirectInteractor = une manette
        if (interactor is XRDirectInteractor)
        {
            //la main qui tire du script dragMove devient la manette en question
            dragMove.draggingHand = interactor.GetComponent <XRController>();
        }
    }
Example #9
0
    //PROCEDURE ON HOVER EXIT
    protected override void OnHoverExit(XRBaseInteractor interactor)
    {
        base.OnHoverExit(interactor);

        if (this.gameObject.tag != "Duplicate")
        {
            adjustQuadScript.SetAdjustListen(false);
        }

        if (interactor.GetComponent <XRController>().controllerNode == joystickController)
        {
            duplicateQuadScript.SetDuplicateListen(false);
        }
    }
Example #10
0
    //PROCEDURE ON TRIGGER RELEASE
    protected override void OnSelectExit(XRBaseInteractor interactor)
    {
        selected = false;

        OnDeactivate(interactor);

        if (interactor.GetComponent <XRController>().controllerNode == handController)
        {
            base.OnSelectExit(interactor);

            ResetAttachmentPoints(interactor);
            ClearInteractor(interactor);

            audioSelectFlag   = false;
            audioActivateFlag = false;

            if (this.gameObject.tag != "Duplicate")
            {
                moveLocomotionScript.moveSpeed = inactiveMoveSpeed;
            }
            else
            {
                base.trackRotation = false;
            }
        }
        else if (interactor.GetComponent <XRController>().controllerNode == joystickController)
        {
            audioSelectFlag   = false;
            audioActivateFlag = false;

            moveLocomotionScript.enabled   = true;
            snapTurnProviderScript.enabled = true;

            rotateQuadScript.SetTranslate(false);
            rotateQuadScript.SetRotate(false);
        }
    }
Example #11
0
    private void Update()
    {
        if (interactorA != null && interactorB != null)
        {
            XRController controllerA = interactorA.GetComponent <XRController>();
            XRController controllerB = interactorB.GetComponent <XRController>();

            bool stateA;
            controllerA.inputDevice.IsPressed(InputHelpers.Button.Trigger, out stateA);
            bool stateB;
            controllerB.inputDevice.IsPressed(InputHelpers.Button.Trigger, out stateB);

            if (stateA && stateB)
            {
                ManageScale();
            }
            else
            {
                onScaleEnd?.Invoke();
                interactorA = null;
                interactorB = null;
            }
        }
    }
    IEnumerator BrakeAssist(XRBaseInteractor interactor)
    {
        VRWC_XRNodeVelocitySupplier interactorVelocity = interactor.GetComponent <VRWC_XRNodeVelocitySupplier>();

        while (grabPoint)
        {
            // If the interactor's forward/backward movement approximates zero, it is considered to be braking.
            if (interactorVelocity.velocity.z < 0.05f && interactorVelocity.velocity.z > -0.05f)
            {
                m_Rigidbody.AddTorque(-m_Rigidbody.angularVelocity.normalized * 25f);

                SpawnGrabPoint(interactor);
            }

            yield return(new WaitForFixedUpdate());
        }
    }
    public override void ProcessInteractable(XRInteractionUpdateOrder.UpdatePhase updatePhase)
    {
        if (selectingInteractor)
        {
            transform.position = selectingInteractor.attachTransform.position;
            transform.rotation = selectingInteractor.attachTransform.rotation;
        }

        if (secondInteractor && selectingInteractor)
        {
            onSecond = true;

            if (snapToSecondHand)
            {
                selectingInteractor.attachTransform.rotation = GetTwoHandRotation();
            }
            else if (!snapToSecondHand)
            {
                selectingInteractor.attachTransform.rotation = GetTwoHandRotation() * initalRotationOffset;
            }

            if (secondInteractor && second)
            {
                second.position = secondPos.position;
                second.rotation = secondInteractor.GetComponent <XRController>().controllerNode == UnityEngine.XR.XRNode.LeftHand || secondPos.localRotation.z == 0 ? secondPos.rotation : secondPos.rotation * Quaternion.Euler(0, 0, 180);
            }
            if (selectingInteractor && first)
            {
                first.position = firstPos.position;
                first.rotation = selectingInteractor.GetComponent <XRController>().controllerNode == UnityEngine.XR.XRNode.LeftHand || firstPos.localRotation.z == 0 ? firstPos.rotation : firstPos.rotation * Quaternion.Euler(0, 0, 180);
            }
        }
        else if (!secondInteractor && selectingInteractor)
        {
            onSecond = false;
            if (selectingInteractor && first)
            {
                first.position = firstPos.position;
                first.rotation = selectingInteractor.GetComponent <XRController>().controllerNode == UnityEngine.XR.XRNode.LeftHand || firstPos.localRotation.z == 0 ? firstPos.rotation : firstPos.rotation * Quaternion.Euler(0, 0, 180);
            }
        }
        base.ProcessInteractable(updatePhase);
    }
 protected override void OnSelectEnter(XRBaseInteractor interactor)
 {
     if (interactor is XRDirectInteractor)
     {
         controllerPos    = interactor.gameObject.transform;
         initalInteractor = (XRDirectInteractor)interactor;
         if (interactor.GetComponent <XRController>().controllerNode == XRNode.LeftHand)
         {
             handPosition = leftHand;
         }
         else
         {
             handPosition = rightHand;
         }
         handPosition.parent   = null;
         handPosition.position = lockPosition.transform.position;
         selected = true;
     }
     base.OnSelectEnter(interactor);
 }
Example #15
0
 private void GetMag()
 {
     if (player.ammoCount > 0)
     {
         if (interactor && !interactor.selectTarget && interactor.GetComponent <XRController>().inputDevice.TryGetFeatureValue(CommonUsages.grip, out float gripValue) && gripValue >= 0.7 && initTime <= Time.time)
         {
             if (interactor == player.right && player.left.selectTarget)
             {
                 var temp    = Instantiate(CheckMag(player.left.selectTarget.GetComponentInChildren <XRSocketInteractorWithName>().targetName), interactor.transform.position, interactor.transform.rotation);
                 var tempMag = temp?.GetComponent <Magazine>();
                 if (tempMag.fullAmmo > player.ammoCount)
                 {
                     tempMag.ammoCount = player.ammoCount;
                     player.ammoCount  = 0;
                 }
                 else
                 {
                     tempMag.ammoCount = tempMag.fullAmmo;
                     player.ammoCount -= tempMag.fullAmmo;
                 }
                 initTime = Time.time + delay;
             }
             else if (interactor == player.left && player.right.selectTarget)
             {
                 var temp    = Instantiate(CheckMag(player.right.selectTarget.GetComponentInChildren <XRSocketInteractorWithName>().targetName), interactor.transform.position, interactor.transform.rotation);
                 var tempMag = temp?.GetComponent <Magazine>();
                 if (tempMag.fullAmmo > player.ammoCount)
                 {
                     tempMag.ammoCount = player.ammoCount;
                     player.ammoCount  = 0;
                 }
                 else
                 {
                     tempMag.ammoCount = tempMag.fullAmmo;
                     player.ammoCount -= tempMag.fullAmmo;
                 }
                 initTime = Time.time + delay;
             }
         }
     }
 }
Example #16
0
 protected override void OnSelectEnter(XRBaseInteractor interactor)
 {
     base.OnSelectEnter(interactor);
     attachedController = interactor.GetComponent <XRController>();
 }
Example #17
0
    //PROCEDURE ON GRIP RELEASE
    protected override void OnDeactivate(XRBaseInteractor interactor)
    {
        if (interactor.GetComponent <XRController>().controllerNode == handController)
        {
            base.OnDeactivate(interactor);

            MatchAttachmentPoints(interactor);

            if (selected)
            {
                audioSelectFlag   = true;
                audioActivateFlag = false;

                if (this.gameObject.tag != "Duplicate")
                {
                    adjustQuadScript.SetAdjustListen(false);
                }

                quadMaterial.SetColor(outlineColorName, selectColorForHandMode);
            }
            else
            {
                audioSelectFlag   = false;
                audioActivateFlag = false;

                if (this.gameObject.tag != "Duplicate")
                {
                    moveLocomotionScript.moveSpeed = inactiveMoveSpeed;
                    adjustQuadScript.SetAdjustListen(true);
                }

                quadMaterial.SetColor(outlineColorName, inactiveColor);
            }

            base.trackRotation = false;
            base.trackPosition = true;
        }
        else if (interactor.GetComponent <XRController>().controllerNode == joystickController)
        {
            if (selected)
            {
                audioSelectFlag   = true;
                audioActivateFlag = false;

                rotateQuadScript.SetTranslate(true);
                rotateQuadScript.SetRotate(false);

                if (this.gameObject.tag != "Duplicate")
                {
                    adjustQuadScript.SetAdjustListen(false);
                }

                quadMaterial.SetColor(outlineColorName, selectColorForJoystickMode);
            }
            else
            {
                audioSelectFlag   = false;
                audioActivateFlag = false;

                rotateQuadScript.SetTranslate(false);
                rotateQuadScript.SetRotate(false);

                if (this.gameObject.tag != "Duplicate")
                {
                    adjustQuadScript.SetAdjustListen(true);
                }

                quadMaterial.SetColor(outlineColorName, inactiveColor);
            }
        }
    }
Example #18
0
 private void OnBeginInteraction(XRBaseInteractor interactor)
 {
     currentInteractorTransform = interactor.transform;
     interactor.GetComponent <XRBaseController>().hideControllerModel = true;
     proxyHand.Activate();
 }
 public void OnRelease(XRBaseInteractor interactor)
 {
     interactor.GetComponent <XRBaseController>().hideControllerModel = false;
     ChangePose(HandPoses.NoPose, interactor);
 }
 public void OnGrab(XRBaseInteractor interactor)
 {
     interactor.GetComponent <XRBaseController>().hideControllerModel = hideController;
     ChangePose(interactionPose, interactor);
 }
Example #21
0
        public IEnumerator ContactInteractorTargetStaysValidWhenTouchingAnyCollider([ValueSource(nameof(s_ContactInteractors))] Type interactorType)
        {
            // This tests that an Interactable will stay as a valid target as long as
            // the Direct and Socket Interactor is touching any Collider associated with the Interactable,
            // and remains so if only some (but not all) of the Interactable colliders leaves.
            var manager = TestUtilities.CreateInteractionManager();
            XRBaseInteractor interactor = null;

            if (interactorType == typeof(XRDirectInteractor))
            {
                interactor = TestUtilities.CreateDirectInteractor();
            }
            else if (interactorType == typeof(XRSocketInteractor))
            {
                interactor = TestUtilities.CreateSocketInteractor();
            }

            Assert.That(interactor, Is.Not.Null);

            var triggerCollider = interactor.GetComponent <SphereCollider>();

            Assert.That(triggerCollider, Is.Not.Null);
            Assert.That(triggerCollider.isTrigger, Is.True);

            var interactable = TestUtilities.CreateGrabInteractable();

            // Prevent the Interactable from being selected to allow the object to be moved freely
            interactable.interactionLayerMask = 0;
            var sphereCollider = interactable.GetComponent <SphereCollider>();

            sphereCollider.center = Vector3.zero;
            sphereCollider.radius = 0.5f;
            Assert.That(sphereCollider, Is.Not.Null);
            interactable.transform.position = Vector3.forward * 10f;

            // Create another Collider to have as part of the Interactable
            var boxColliderTransform = new GameObject("Box Collider", typeof(BoxCollider)).transform;

            boxColliderTransform.SetParent(interactable.transform);
            boxColliderTransform.localPosition = Vector3.right;
            boxColliderTransform.localRotation = Quaternion.identity;
            var boxCollider = boxColliderTransform.GetComponent <BoxCollider>();

            boxCollider.center = Vector3.zero;
            boxCollider.size   = Vector3.one;

            interactable.colliders.Clear();
            interactable.colliders.Add(sphereCollider);
            interactable.colliders.Add(boxCollider);

            interactable.enabled = false;
            interactable.enabled = true;

            Assert.That(manager.GetInteractableForCollider(sphereCollider), Is.EqualTo(interactable));
            Assert.That(manager.GetInteractableForCollider(boxCollider), Is.EqualTo(interactable));

            yield return(null);

            yield return(new WaitForFixedUpdate());

            var directOverlaps = Physics.OverlapSphere(triggerCollider.transform.position, triggerCollider.radius, -1, QueryTriggerInteraction.Ignore);

            Assert.That(directOverlaps, Is.Empty);

            var validTargets = new List <XRBaseInteractable>();

            interactor.GetValidTargets(validTargets);
            Assert.That(validTargets, Is.Empty);

            // Move the Interactable to the Direct Interactor so that it overlaps both colliders
            interactable.transform.position = Vector3.left * 0.5f;

            yield return(new WaitForFixedUpdate());

            yield return(null);

            directOverlaps = Physics.OverlapSphere(triggerCollider.transform.position, triggerCollider.radius, -1, QueryTriggerInteraction.Ignore);
            Assert.That(directOverlaps, Is.EquivalentTo(new Collider[] { sphereCollider, boxCollider }));

            interactor.GetValidTargets(validTargets);
            Assert.That(validTargets, Is.EqualTo(new[] { interactable }));

            // Move the Interactable some so one of the colliders leaves
            interactable.transform.position = Vector3.left * 2f;

            yield return(new WaitForFixedUpdate());

            yield return(null);

            directOverlaps = Physics.OverlapSphere(triggerCollider.transform.position, triggerCollider.radius, -1, QueryTriggerInteraction.Ignore);
            Assert.That(directOverlaps, Is.EquivalentTo(new Collider[] { boxCollider }));

            interactor.GetValidTargets(validTargets);
            Assert.That(validTargets, Is.EqualTo(new[] { interactable }));

            // Move the Interactable some so the other collider is the one being hovered
            // to test that colliders can re-enter after previously exiting
            interactable.transform.position = Vector3.right * 1f;

            yield return(new WaitForFixedUpdate());

            yield return(null);

            directOverlaps = Physics.OverlapSphere(triggerCollider.transform.position, triggerCollider.radius, -1, QueryTriggerInteraction.Ignore);
            Assert.That(directOverlaps, Is.EquivalentTo(new Collider[] { sphereCollider }));

            interactor.GetValidTargets(validTargets);
            Assert.That(validTargets, Is.EqualTo(new[] { interactable }));

            // Move the Interactable so all colliders exits the Direct Interactor
            interactable.transform.position = Vector3.forward * 10f;

            yield return(new WaitForFixedUpdate());

            yield return(null);

            directOverlaps = Physics.OverlapSphere(triggerCollider.transform.position, triggerCollider.radius, -1, QueryTriggerInteraction.Ignore);
            Assert.That(directOverlaps, Is.Empty);

            interactor.GetValidTargets(validTargets);
            Assert.That(validTargets, Is.Empty);
        }
Example #22
0
    public override void ProcessInteractable(XRInteractionUpdateOrder.UpdatePhase updatePhase)
    {
        if (updatePhase == XRInteractionUpdateOrder.UpdatePhase.Fixed)
        {
            if (isSelected)
            {
                if (selectingInteractor != null)
                {
                    if (selectingController == null)
                    {
                        selectingController = selectingInteractor.GetComponent <XRController>();
                    }

                    if (selectingController.inputDevice.TryGetFeatureValue(CommonUsages.primary2DAxis, out Vector2 value))
                    {
                        Vector2 newValue = value;
                        if (Mathf.Abs(newValue.x) > joyStickInputLimit)
                        {
                            newValue.x = 1f;
                            if (value.x < 0f)
                            {
                                newValue.x = -newValue.x;
                            }
                        }
                        else
                        {
                            newValue.x = 0f;
                        }

                        if (Mathf.Abs(newValue.y) > joyStickInputLimit)
                        {
                            newValue.y = 1f;
                            if (value.y < 0f)
                            {
                                newValue.y = -newValue.y;
                            }
                        }
                        else
                        {
                            newValue.y = 0f;
                        }

                        if (newValue.x != 0f || newValue.y != 0f)
                        {
                            OnJoyStickChange(newValue);
                        }


                        float joyStickXAngle = Mathf.LerpAngle(0f, maxJoyStickAngle, Mathf.Abs(value.x));
                        if (value.x < 0f)
                        {
                            joyStickXAngle = -joyStickXAngle;
                        }

                        float joyStickYAngle = Mathf.LerpAngle(0f, maxJoyStickAngle, Mathf.Abs(value.y));
                        if (value.y < 0f)
                        {
                            joyStickYAngle = -joyStickYAngle;
                        }

                        joyStick.transform.localRotation = Quaternion.Euler(joyStickYAngle, 0f, -joyStickXAngle);
                    }
                }
            }
        }
    }
Example #23
0
 private void OnEndInteraction(XRBaseInteractor interactor)
 {
     currentInteractorTransform = null;
     interactor.GetComponent <XRBaseController>().hideControllerModel = false;
     proxyHand.Deactivate();
 }
Example #24
0
 private void DropWeapon(XRBaseInteractor interactor)
 {
     interactor.GetComponent <MeshHider>().Show();
 }
Example #25
0
 private void PickUpWeapon(XRBaseInteractor interactor)
 {
     interactor.GetComponent <MeshHider>().Hide();
 }