# How to keep player momentum after a jump landing (2D)

Hey guys,

I’m creating a Mario clone and I need to keep the player’s momentum into the jump and then onward into the landing. I can’t figure out how to achieve this. Every time I land, the player has to build up momentum again. Any Idea how to fix this? Here’s my code:

``````    Animator animator;
Rigidbody2D rb;
bool isGrounded;
public float moveSpeed;
public Vector2 acceleration;
public float jumpHeight;
public Transform groundCheckM;
public Transform groundCheckL;
public Transform groundCheckR;

void Start()
{
animator = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>();
transform.eulerAngles = new Vector3(0, 0, 0);
}

private void Update()
{

if
((Physics2D.Linecast(transform.position,groundCheckM.position, 1 << LayerMask.NameToLayer("Floor/Platforms"))) || //Check if grounded
(Physics2D.Linecast(transform.position, groundCheckL.position, 1 << LayerMask.NameToLayer("Floor/Platforms"))) ||
(Physics2D.Linecast(transform.position, groundCheckR.position, 1 << LayerMask.NameToLayer("Floor/Platforms"))))
{
isGrounded = true;
animator.SetBool("Jump", false);
}

else
{
isGrounded = false;
}

animator.SetFloat("Walk", rb.velocity.x);  //Set animation float to x velocity

if (rb.velocity.x <= 0.03f && rb.velocity.x >= -0.03f && isGrounded) //Play "Idle" animation
{
animator.Play("Mario_Idle");
}

if (rb.velocity.x >=4 || rb.velocity.x <=-4)

{
animator.speed = Mathf.Abs(rb.velocity.x / 5.5f); //Increase speed of walking animation with player's walking speed
}

}
void FixedUpdate()
{

if (Input.GetKey("d") || Input.GetKey("right")) //Move player to the right
{
transform.rotation = Quaternion.Euler (0, 0, 0);
}

else if (Input.GetKey("a") || Input.GetKey("left")) //Move player to the left
{
transform.rotation = Quaternion.Euler(0, 180, 0);
}

if (rb.velocity.x >= 10)
{
rb.velocity = new Vector2(10, rb.velocity.y);   //Cap player speed at 10 when moving right
}

else if (rb.velocity.x <= -10)
{
rb.velocity = new Vector2(-10, rb.velocity.y);  //Cap player speed at 10 when moving left
}

if (Input.GetKey("space") && isGrounded) //Player jump
{
rb.velocity += new Vector2(rb.velocity.x, jumpHeight);
animator.SetBool("Jump", true);
}

}

}
``````

You could maybe take the x velocity right before the jump and put it in a variable
then set the X velocity during the jump and after the jump to the initial velocity X .

``````  if (Input.GetKey("space") && isGrounded) //Player jump
{
Vector2 InitalVelocity = rb.velocity; // you can make it a global variable so you can do this when landing too.
rb.velocity += new Vector2(rb.velocity.x, jumpHeight);
Vector2 vel = rb.velocity;
vel.x = InitalVelocity.x;
rb.velocity = vel;
animator.SetBool("Jump", true);
}
``````