Beispiel #1
0
    private void Release()
    {
        // Reset State Variables
        isGrabbing      = false;
        playerPushState = PushState.None;

        // Make target subject to physics again
        target.GetComponent <Rigidbody>().isKinematic = false;

        // Restore player movement speed
        RestoreSpeed();

        // clear override push/pull parameters
        overrideParameters = null;

        // Enable player movement
        playerMotor.canControl = true;
    }
Beispiel #2
0
    private IEnumerator Grab()
    {
        // Disable player movement
        playerMotor.canControl = false;

        // get push direction
        playerPushDir = GetPushDirection();

        // populate collider bounding points dictionary
        dicColliderPoints = GetColliderVertexPositions(target);

        Vector3 startPos = player.position;
        Vector3 endPos   = Vector3.zero;
        Vector3 temp     = Vector3.zero;

        float zExtents = (dicColliderPoints[ColliderBoundsVertex.LowerForwardLeft] - dicColliderPoints[ColliderBoundsVertex.LowerBackLeft]).magnitude / 2;
        float xExtents = (dicColliderPoints[ColliderBoundsVertex.LowerBackRight] - dicColliderPoints[ColliderBoundsVertex.LowerBackLeft]).magnitude / 2;

        if (playerPushDir == PushDirection.TargetForward)
        {
            temp = target.position - (target.forward * (zExtents + (playerCtrl.radius / 2) + GrabDistance));
        }
        else if (playerPushDir == PushDirection.TargetBack)
        {
            temp = target.position + (target.forward * (zExtents + (playerCtrl.radius / 2) + GrabDistance));
        }
        else if (playerPushDir == PushDirection.TargetRight)
        {
            temp = target.position - (target.right * (xExtents + (playerCtrl.radius / 2) + GrabDistance));
        }
        else if (playerPushDir == PushDirection.TargetLeft)
        {
            temp = target.position + (target.right * (xExtents + (playerCtrl.radius / 2) + GrabDistance));
        }

        endPos = new Vector3(temp.x, player.position.y, temp.z);

        // move player
        float startTime = Time.time;

        playerPushState = PushState.MovingPlayer;
        while (Time.time < startTime + GrabMoveTime)
        {
            Vector3 lastPos = player.position;
            Vector3 newPos  = Vector3.Lerp(startPos, endPos, (Time.time - startTime) / GrabMoveTime) - lastPos;

            playerCtrl.Move(newPos);
            yield return(null);
        }

        // set state
        playerPushState    = PushState.None;
        localGrabPosition  = target.position - player.position;
        targetLastPosition = target.position;
        targetLastRotation = target.eulerAngles;

        // smooth movement
        target.GetComponent <Rigidbody>().isKinematic = true;

        // set override push/pull parameters
        PushPullObject ppObj = target.GetComponent <PushPullObject>();

        if (ppObj != null)
        {
            overrideParameters = ppObj.parameters;
        }

        // Slow player movement
        SlowSpeed();
    }