GrabbableSizedObject.MoveToNotGrabbedPosition C# (CSharp) Method

MoveToNotGrabbedPosition() protected method

protected MoveToNotGrabbedPosition ( ) : IEnumerator
return IEnumerator
    protected override IEnumerator MoveToNotGrabbedPosition()
    {
        moveToLastPosition = true;

        // anchor.parent = lastParent;

        transform.parent = lastParent;
        anchor.position = transform.position;

        myRigidbody.isKinematic = true;

//        LimitJoint();

        var moveToTargetPos = true;


        var targetPosition = GetMoveToNotGrabbedOffsetPosition();

//        Debug.Log("Target Position");
//        Debug.Log(targetPosition);

        var initRotation = transform.rotation;
        var targetRotation = GetMoveToNotGrabbedRotation();

        var initDist = Vector3.Distance(transform.position, targetPosition);

        while (moveToTargetPos)
        {
            var toTarget = targetPosition - transform.position;

            var moveDistance = Mathf.Min(grabSpeed * Time.deltaTime, toTarget.magnitude);

            transform.position += toTarget.normalized * moveDistance;

            // Handle Rotation Slerp
            var dist = Vector3.Distance(transform.position, targetPosition);
            var t = dist / Mathf.Max(initDist, float.Epsilon);

            transform.rotation = Quaternion.Slerp(targetRotation, initRotation, t);

            if (Vector3.Distance(transform.position, targetPosition) < 0.004f)
            {
                moveToTargetPos = false;
            }
            else
            {
                yield return new WaitForFixedUpdate();
            }
        }

        targetPosition = GetMoveToNotGrabbedPosition();

        myRigidbody.velocity = Vector3.zero;
        myRigidbody.angularVelocity = Vector3.zero;

        while (moveToLastPosition)
        {
            var toTarget = targetPosition - transform.position;

            var moveDistance = Mathf.Min(grabSpeed * Time.deltaTime, toTarget.magnitude);

            transform.position += toTarget.normalized * moveDistance;

            transform.rotation = targetRotation;

            if (Vector3.Distance(transform.position, targetPosition) < 0.01f)
            {
                moveToLastPosition = false;
                transform.position = targetPosition;
                // myJoint.linearLimit = new SoftJointLimit();

                FreeJoint();
                anchor.position = transform.position;

                myRigidbody.velocity = Vector3.zero;
                myRigidbody.angularVelocity = Vector3.zero;

                myRigidbody.drag = freeDrag;

//                yield return  new WaitForSeconds(0.05f);
                myRigidbody.isKinematic = false;

                trigger.SetActive(true);

				// Now that we're done moving, notify the puzzle
				puzzle.PlaceSizedObjectOnObject(this, objectBelow);
            }
            else
            {
                yield return new WaitForFixedUpdate();
            }
        }
    }
}