- Home /
Player Movement with Acceleration and Deceleration FPS
I am currently working on an FPS where the player is able to build up speed over time, up to a maxSpeed, and slowly decelerate when no input is detected. I am using the CharacterController provided by Unity At the moment, the player does start speeding up but there are two issues -
When no forward input is detected, currentSpeed starts slowly decreasing however when new input is detected, that same speed is kept and added on top of it. (at this point player does not physically move / slip)
The player does not move if not input is detected, should I add a slippery material to the player?
This is the current code in Update -
// Call Game Controller to check if controller has been detected and switch controls
xAxis = Input.GetAxis("Horizontal"); // left right
zAxis = Input.GetAxis("Vertical"); // forward vector
//Increase or decrease the player movement speed
if (zAxis > 0)
{
//Increase the player speed
currentPlayerSpeed += acceleration * Time.deltaTime;
}
else if (zAxis < 0)
{
//Decrease the player speed
currentPlayerSpeed -= acceleration * Time.deltaTime;
}
if (zAxis == 0)
{
if (currentPlayerSpeed > acceleration) currentPlayerSpeed -= acceleration ;
if (currentPlayerSpeed < -acceleration) currentPlayerSpeed += acceleration ;
}
/*
else //Braking
{
if (currentPlayerSpeed > 0.1f)
currentPlayerSpeed -= deceleration * Time.deltaTime;
else if (currentPlayerSpeed < -0.1f)
currentPlayerSpeed += deceleration * Time.deltaTime;
else
currentPlayerSpeed = 0.0f;
}
*/
//Clamp the speed
currentPlayerSpeed = Mathf.Clamp(currentPlayerSpeed, 0f, maxPlayerSpeed);
Vector3 movement = transform.right * xAxis + transform.forward * zAxis;
characterController.Move(movement * currentPlayerSpeed * Time.deltaTime);
$$anonymous$$anaged to get the speed to decrease over time by the same rate it was accelerating
// Call Game Controller to check if controller has been detected and switch controls
xAxis = Input.GetAxis("Horizontal"); // left right
zAxis = Input.GetAxis("Vertical"); // forward vector
//Increase or decrease the player movement speed
if (zAxis > 0)
{
//Increase the player speed
currentPlayerSpeed += acceleration * Time.deltaTime;
}
if (zAxis == 0)
{
currentPlayerSpeed -= acceleration * Time.deltaTime;
}
//Clamp the speed
currentPlayerSpeed = $$anonymous$$athf.Clamp(currentPlayerSpeed, 0f, maxPlayerSpeed);
Your answer
Follow this Question
Related Questions
Accelerating and Decelerating a Characters's speed 1 Answer
Add acceleration to movement 0 Answers
Acceleration with CC 0 Answers
Detect phone sliding movement across table 0 Answers
Physics object slides while turning. 1 Answer