// Update is called once per frame private void Update() { if (Controller.GrabAction()) { if (grabDecorator.HasObjectGrabbed) { grabDecorator.DetachObject(); } else { grabDecorator.AttemptToGrab(); } } }
IEnumerator GrabbingCoroutine() { _isGrabbingInProgress = true; var distanceBetweenBeakAndCollider = Vector3.Distance(BeakToMove.transform.position, CollidertoGoTo.transform.position) + distanceCorrection; var vectorToTest = CollidertoGoTo.gameObject.transform.position; vectorToTest = BeakToMove.transform.InverseTransformPoint(vectorToTest); var positionTogoTo = vectorToTest.normalized * distanceBetweenBeakAndCollider; originalPosition = BeakToMove.transform.localPosition.Clone(); while (positionTogoTo != BeakToMove.transform.localPosition) { BeakToMove.transform.localPosition = Vector3.MoveTowards(BeakToMove.transform.localPosition, positionTogoTo, speed * Time.deltaTime); yield return(null); } if (!internalGrabbing.AttemptToGrab()) { _isDetachingInProgress = true; while (_isDetachingInProgress) { StartCoroutine(DetachingCoroutine()); yield return(null); } } else { while (Vector3.Distance(BeakToMove.transform.localPosition, originalPosition) >= distanceToKeepAfterGrab) { BeakToMove.transform.localPosition = Vector3.MoveTowards(BeakToMove.transform.localPosition, originalPosition, speedBackwards * Time.deltaTime); grabbingScript.ObjectGrabbed.transform.localPosition = Vector3.MoveTowards(grabbingScript.ObjectGrabbed.transform.localPosition, originalPosition, speedBackwards * Time.deltaTime); yield return(null); } _isGrabbingInProgress = false; } }