Can't control movement while jumping

I’m very new to Unity and I’ve been trying to learn it all day but I can’t seem to get my character to move while he’s in the air. I’m trying to make a simple 3D platformer, simpler than the tutorial one in the asset store so I don’t want to use that as a reference.

I know the isGrounded statement is in there but when i take that out or seperate it so it tests for when the controller is not grounded, the jumping turns into a small hop and slowly falls down.

var speed : float = 6.0;
var jumpSpeed : float = 8.0;
var gravity : float = 20.0;
private var moveDirection : Vector3 = Vector3.zero;
function Update() {
    var controller : CharacterController = GetComponent(CharacterController);
    
    if (controller.isGrounded) {
        // We are grounded, so recalculate
        // move direction directly from axes

        moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
        moveDirection = transform.TransformDirection(moveDirection);
        moveDirection *= speed;

        if (Input.GetButton ("Jump")) {
            moveDirection.y = jumpSpeed;
        }
    }
    // Apply gravity
    moveDirection.y -= gravity * Time.deltaTime;
    
    // Move the controller
    controller.Move(moveDirection * Time.deltaTime);
}

Start by moving these lines:

    moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
    moveDirection = transform.TransformDirection(moveDirection);
    moveDirection *= speed;

to just above your check to see if the controller is grounded. This will allow moveDirection to be affected by your horizontal input regardless of whether you are grounded or not.

However, you’ll also need to add a variable to keep track of the Y velocity as you adjust your move direction - in the code you’ve posted, since you can’t move in the air, it’s not an issue that you set the Y component of moveDirection to 0 every update that you’re on the ground, but you don’t want to be resetting your Y velocity to 0 every update.

Something like what’s below should do the trick.

var yVel : float = moveDirection.y;

moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;

moveDirection += (Vector3.up * yVel);