private void BoomerangToTarget(Vector3 targetToFlyTo) { if (Vector3.Distance(this.transform.position, targetToFlyTo) <= closeDistance) { if (state == State.FLYING) { realThrowTime = Vector3.Distance(targetPosition, originPosition) / throwSpeed; flyUpTime = realThrowTime / 2f; arcSizeIncrementer = arcSize; arcSizeIncrementerDecrementer = arcSizeIncrementer / flyUpTime; state = State.FLYINGBACK; } else { state = State.IDLE; OnDone(); } return; } Vector2 boomerangDirection = targetToFlyTo - this.transform.position; boomerangDirection.Normalize(); this.transform.right = boomerangDirection; if (realThrowTime > flyUpTime) { boomerangChild.localPosition = TransformUtils.ModifyY(boomerangChild, boomerangChild.localPosition.y + arcSizeIncrementer, true); arcSizeIncrementer -= arcSizeIncrementerDecrementer; } else { boomerangChild.localPosition = TransformUtils.ModifyY(boomerangChild, boomerangChild.localPosition.y - arcSizeIncrementer, true); arcSizeIncrementer += arcSizeIncrementerDecrementer; } }