# Rigidbody flies up instead of just jumping.

I have this script attached to a capsule with a capsule collider and a rigidbody:

``````using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{

public float Speed;
public float JumpStrenght;

Rigidbody rb;

// Use this for initialization
void Start ()
{

rb = GetComponent<Rigidbody> ();

}

// Update is called once per frame
void Update ()
{
Jump ();
}

void FixedUpdate ()
{
Move ();

}

float hMov;
float vMov;

void Move ()
{
hMov = Input.GetAxisRaw ("Horizontal");
vMov = Input.GetAxisRaw ("Vertical");

Vector3 moveVector = new Vector3 (hMov, rb.velocity.y, vMov);
moveVector.Normalize ();
rb.velocity = transform.TransformDirection (moveVector * Speed);

}

void Jump ()
{
if (Input.GetKeyDown (KeyCode.Space)) {
rb.velocity += Vector3.up * JumpStrenght;
}
}
}
``````

When I press the space key the player starts flying upwards and never stops but I just want it to
jump.

How to fix it?

In these three lines:

``````Vector3 moveVector = new Vector3 (hMov, rb.velocity.y, vMov);
moveVector.Normalize ();
rb.velocity = transform.TransformDirection (moveVector * Speed);
``````

you create a vector, normalize it, then set that as your new velocity.

Why is this a problem? Well, you’re factoring in vertical movement before normalizing the vector.

Fortunately, that also makes it an easy problem to solve, as well as an opportunity to improve efficiency and gamepad/analog support at the same time.

``````Vector3 moveVector = transform.TransformDirection(new Vector3(hMov, 0, vMov));
if(moveVector.sqrMagnitude > 1.0f)
{
moveVector.Normalize();
}
rb.velocity = (moveVector * Speed) + new Vector3(0, rb.velocity.y, 0);
``````

With the if statement, the Vector only needs to be normalized when holding a diagonal for input. Then, the current effects of gravity are only factored in after everything else has been handled, so it will be left unaffected.