private IEnumerator CurveInterp(Vector3 startPos, Vector3 endPos, float duration, AnimationCurve curve)
        {
            Vector3 prevPos = startPos;
            Vector3 targetPos;
            float   timer = 0;
            float   curveFraction;
            float   forwardSpeed = 0;

            while (timer <= duration)
            {
                curveFraction = curve.Evaluate(Mathf.Clamp01(timer / duration));
                targetPos     = Vector3.LerpUnclamped(startPos, endPos, curveFraction);
                transform.Translate(targetPos - prevPos, Space.Self);
                prevPos            = targetPos;
                timer             += Time.smoothDeltaTime;
                forwardSpeed       = (VerticalMoveDir == VerticalMovementDirection.up) ? Mathf.Lerp(speed, speed * jumpForwardSpeedModifier, timer / duration) : Mathf.Lerp(speed * jumpForwardSpeedModifier, speed, timer / duration);
                transform.position = transform.position + (transform.forward * forwardSpeed * Time.smoothDeltaTime);

                yield return(null);
            }

            if (VerticalMoveDir == VerticalMovementDirection.down)
            {
                transform.position = new Vector3(transform.position.x, StartY, transform.position.z);
                OnGround           = true;
            }


            if (VerticalMoveDir == VerticalMovementDirection.up)
            {
                transform.position = new Vector3(transform.position.x, jumpHeight + StartY, transform.position.z);
                VerticalMoveDir    = VerticalMovementDirection.none;
                Land();
                yield break;
            }

            VerticalMoveDir = VerticalMovementDirection.none;
            yield break;
        }
 private void Land()
 {
     VerticalMoveDir = VerticalMovementDirection.down;
     StartCoroutine(CurveInterp(Vector3.zero, new Vector3(0, -jumpHeight, 0), jumpDuration, jumpCurve));
 }
 public void Jump()
 {
     VerticalMoveDir = VerticalMovementDirection.up;
     OnGround        = false;
     StartCoroutine(CurveInterp(Vector3.zero, new Vector3(0, jumpHeight, 0), jumpDuration, jumpCurve));
 }