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;
        }
    }