- Home /
How to keep current velocity while jumping?
I'm creating an FPS just as a pet project of mine and I'm having lots of trouble fine-tuning the jumping. I want to be able to jump to where no matter where you turn the camera after you jump, you'll continue moving the way you first looked while jumping, unless i press the movement keys. Most of the code in from the Acacia Developer's character controller video, which doesn't include jumping, I can't think of a way to do it and I haven't found any youtube tutorials that help. Thanks in advance!
Movement script code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] Transform playerCamera;
[SerializeField][Range(0.1f, 10.0f)] float mouseSensitivity = 1.75f;
//Makes sensitivity Slider bar in inspector
[SerializeField] float walkSpeed = 5.0f;
[SerializeField] float airSpeed = 5.0f;
[SerializeField] float jumpForce = 5.0f;
bool isJumping = false;
[SerializeField] float gravity = -13.0f;
[SerializeField] float slopeForce;
[SerializeField] float slopeForceRayLength;
[SerializeField] [Range(0.0f, 0.5f)] float moveSmoothTime = 0.1f;
[SerializeField] [Range(0.0f, 0.5f)] float mouseSmoothTime = 0.03f;
[SerializeField] bool invertedYAxis = false;
[SerializeField] bool lockCursor = true;
float cameraPitch = 0.0f;
float velocityY = 0.0f;
float tempVelY = 0.0f;
float tempCurDir = 0.0f;
Vector3 velocity;
CharacterController controller = null;
Vector2 currentDir = Vector2.zero;
Vector2 currentDirVelocity = Vector2.zero;
Vector2 currentMouseDelta = Vector2.zero;
Vector2 currentMouseDeltaVelocity = Vector2.zero;
void Start()
{
controller = GetComponent<CharacterController>();
if(lockCursor)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
}
// Update is called once per frame
void Update()
{
updateMouseLook();
updateMovement();
}
private void updateMouseLook()
{
Vector2 targetMouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
currentMouseDelta = Vector2.SmoothDamp(currentMouseDelta, targetMouseDelta, ref currentMouseDeltaVelocity, mouseSmoothTime);
if (invertedYAxis)
cameraPitch += currentMouseDelta.y * mouseSensitivity;
else
cameraPitch -= currentMouseDelta.y * mouseSensitivity;
cameraPitch = Mathf.Clamp(cameraPitch, -90.0f, 90.0f);
playerCamera.localEulerAngles = Vector3.right * cameraPitch;
transform.Rotate(Vector3.up * currentMouseDelta.x * mouseSensitivity);
}
private void updateMovement()
{
Vector2 targetDir = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
targetDir.Normalize();
currentDir = Vector2.SmoothDamp(currentDir, targetDir, ref currentDirVelocity, moveSmoothTime);
if (Input.GetButtonDown("Jump") && !isJumping)
{
isJumping = true;
tempVelY = jumpForce;
}
if (isJumping)
{
controller.slopeLimit = 90.0f;
tempVelY += gravity * Time.deltaTime;
velocityY = tempVelY;
if (targetDir.y > 0 || targetDir.y < 0)
tempCurDir = currentDir.y;
if (controller.isGrounded && tempVelY < 0)
{
controller.slopeLimit = 45.0f;
isJumping = false;
tempCurDir = 0.0f;
}
}
else if (controller.isGrounded && velocityY < 0)
{
velocityY = 0.0f;
}
else
velocityY += gravity * Time.deltaTime;
if (isJumping)
velocity = (transform.forward * currentDir.y + transform.right * currentDir.x) * airSpeed + Vector3.up * velocityY;
else
velocity = (transform.forward * currentDir.y + transform.right * currentDir.x) * walkSpeed + Vector3.up * velocityY;
controller.Move(velocity * Time.deltaTime);
if ((targetDir.x != 0 || targetDir.y != 0) && onSlope())
controller.Move(Vector3.down * controller.height / 2 * slopeForce * Time.deltaTime);
}
private bool onSlope()
{
if (isJumping)
return false;
RaycastHit hit;
if (Physics.Raycast(transform.position, Vector3.down, out hit, controller.height / 2 * slopeForceRayLength))
if (hit.normal != Vector3.up)
return true;
return false;
}
}
Your answer
Follow this Question
Related Questions
My player keeps launching into the sky 1 Answer
How to "push" CharacterController off of a wall's surface normal? 1 Answer
How do I make a jumping and ledge-grabbing system, similar to TLoZ OOT in unity 3d? 0 Answers
Can't fix slow jumping for character controller 3D 1 Answer
Why can't I properly jump? 2 Answers