Esempio n. 1
0
    public void Pickup()
    {
        //Get Nearest
        currentInteractable = GetNearestInteractable();
        oldPosition         = currentInteractable.transform.position;
        oldRotation         = currentInteractable.transform.rotation;

        //Null check - do we have something?
        if (!currentInteractable)
        {
            return;
        }

        //Already held? Check
        if (currentInteractable.activeHand)
        {
            if (currentInteractable.activeHand)
            {
                currentInteractable.activeHand.Drop();
            }
        }

        //Position to controller
        currentInteractable.ApplyOffset(transform);

        //Attach
        Rigidbody targetBody = currentInteractable.GetComponent <Rigidbody>();

        joint.connectedBody = targetBody;


        //Set Active Hand
        currentInteractable.activeHand = this;
    }
Esempio n. 2
0
    private CustomInteractable GetNearestInteractable()
    {
        CustomInteractable nearest = null;
        float minDistance          = float.MaxValue;
        float distance             = 0.0f;

        foreach (CustomInteractable interactable in ContactInteractables)
        {
            distance = (interactable.transform.position - transform.position).sqrMagnitude;

            if (distance < minDistance)
            {
                minDistance = distance;
                nearest     = interactable;
            }
        }
        return(nearest);
    }
Esempio n. 3
0
    public void Drop()
    {
        //Null Check
        if (!currentInteractable)
        {
            return;
        }

        //Detach from joint
        joint.connectedBody = null;

        //Return to original position
        currentInteractable.transform.position = oldPosition;
        currentInteractable.transform.rotation = oldRotation;

        //Clear activeHand/currentInteractable
        currentInteractable.activeHand = null;
        currentInteractable            = null;
    }
Esempio n. 4
0
    private void GrabCheck()
    {
        if (grabType != GrabType.None && grabInteractable)
        {
            if (grabType == GrabType.Pinch && pinchButton.GetStateUp(handType))
            {
                grabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver);
                GrabEnd();
            }
            if (grabType == GrabType.Grip && grabButton.GetStateUp(handType))
            {
                grabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver);
                GrabEnd();
            }
        }

        if (!grabPoser)
        {
            if (blend > 0)
            {
                blendToAnimation      += 1f / blend * Time.deltaTime;
                blendToAnimation       = Mathf.Clamp01(blendToAnimation);
                blendToPose           += 1f / blendPosition * Time.deltaTime;
                blendToPose            = Mathf.Clamp01(blendToPose);
                blendToPoseMoveObject += 1f / blendPosition * Time.deltaTime;
                blendToPoseMoveObject  = Mathf.Clamp01(blendToPoseMoveObject);
            }
            else
            {
                blendToAnimation = 1;
            }

            CustomInteractable __oldGrabInteractable = grabInteractable;
            if (selectedIndexInteractable)
            {
                grabInteractable = selectedIndexInteractable;
                if (grabInteractable != __oldGrabInteractable)
                {
                    if (__oldGrabInteractable)
                    {
                        __oldGrabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver);
                    }
                    if (grabInteractable)
                    {
                        grabInteractable.SendMessage("GrabStart", this, SendMessageOptions.DontRequireReceiver);
                        setHandTransform = false;
                        grabType         = GrabType.Select;
                        RenderModelVisible(!grabInteractable.hideController);
                        SkeletonUpdate();
                        blendToPose           = 1;
                        blendToPoseMoveObject = 1;
                        _endFramePos          = transform.parent.InverseTransformPoint(skeleton.transform.position);
                        _endFrameRot          = skeleton.transform.rotation;
                    }
                }
            }
            else
            {
                if (selectedPinchInteractable && pinchButton.GetStateDown(handType))
                {
                    grabInteractable = selectedPinchInteractable;
                    if (grabInteractable != __oldGrabInteractable)
                    {
                        if (__oldGrabInteractable)
                        {
                            __oldGrabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver);
                        }
                        if (grabInteractable)
                        {
                            grabInteractable.SendMessage("GrabStart", this, SendMessageOptions.DontRequireReceiver);
                            setHandTransform = false;
                            grabType         = GrabType.Pinch;
                            RenderModelVisible(!grabInteractable.hideController);
                            SkeletonUpdate();
                            blendToPose           = 1;
                            blendToPoseMoveObject = 1;
                            _endFramePos          = transform.parent.InverseTransformPoint(skeleton.transform.position);
                            _endFrameRot          = skeleton.transform.rotation;
                        }
                    }
                }
                else
                {
                    if (selectedGripInteractable && grabButton.GetStateDown(handType))
                    {
                        grabInteractable = selectedGripInteractable;
                        if (grabInteractable != __oldGrabInteractable)
                        {
                            if (__oldGrabInteractable)
                            {
                                __oldGrabInteractable.SendMessage("GrabEnd", this, SendMessageOptions.DontRequireReceiver);
                            }
                            if (grabInteractable)
                            {
                                grabInteractable.SendMessage("GrabStart", this, SendMessageOptions.DontRequireReceiver);
                                setHandTransform = false;
                                grabType         = GrabType.Grip;
                                RenderModelVisible(!grabInteractable.hideController);
                                SkeletonUpdate();
                                blendToPose           = 1;
                                blendToPoseMoveObject = 1;
                                _endFramePos          = transform.parent.InverseTransformPoint(skeleton.transform.position);
                                _endFrameRot          = skeleton.transform.rotation;
                            }
                        }
                    }
                }
            }
        }
    }