# How to apply smooth damp to movement?

Hi, my current movement when rapidly pressing left, right, forward, backward feels too snappy. How do I make it so that the speed builds up to its full potential speed, when you hold the button long enough? I’m a beginner, so could you explain why and how it would work?

Here’s my code:

public class CharacterMovement : MonoBehaviour
{

``````public CharacterController controller;

public Transform cam;

public float speed = 6f;

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
Vector3 direction = new Vector3(horizontal, 0, vertical).normalized;

if (direction.magnitude >= 0.1f)
{

float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y;

Vector3 moveDirection = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
controller.Move(moveDirection.normalized * speed * Time.deltaTime);

}
}
``````

Create a speed or velocity member variable and increase / decrease that when you press the button. For example

``````float speed; // make this a member of the class
float forwardInput = keyPressed? 1 : 0;
speed = Mathf.MoveTowards(speed, forwardInput * walkSpeed, Time.deltaTime * acceleration);
``````

Make sure it’s the class member variable, not a local variable, so its value is preserved.
Then, simply move the character by the speed / velocity in every Update

``````position += Transform.forward * speed * Time.deltaTime;
``````

Extend this code to add negative speed when backwards button is pressed (or add strafing as well)
The difference between the speed and velocity could be that speed is a scalar while velocity is a vector. In the example above, you accumulate speed that you move forward with, even after your character changes facing (rotates / turns). You could hold a velocity variable instead of a speed, expressing the movement over time in world space. In such case it could look like this

``````Vector3 velocity; //again, a member of the class
float forwardInput = keyPressed? 1 : 0;
velocity = Vector3.MoveTowards(velocity, Transform.forward * forwardInput * walkSpeed, Time.deltaTime * acceleration);
position += velocity * Time.deltaTime;
``````

The difference here is that once you accumulate velocity, you will continue moving in that same direction even after your character turns / rotates