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