Air Control While Jumping?

so i’m trying to make a 3rd person platformer. everything works absolutely fine as it is. but what i want to be able to do is control the players direction while he is in the air/jumping. i have tried a lot of things so far and done a bit of research. i just cant seem to figure is out… now i am only learning i an very new to coding. im just hoping that someone can push me in the right direction to get this to work. Thank-you!

	[Header("Speed/Movement Settings")]
	public float crouchSpeed = 2.5f;
	public float walkSpeed = 5f;
	public float runSpeed = 10f;
	public float maxSlopeLimit = 45f;
	private float speed; //the walk speed of the player

	[Header("Jumping/Gravity Settings")]
	public bool doubleJump; //bool for single of double jump
	public bool airMove;
	public float jumpForce = 15f; //how fast the player will move up when jumping
	public float gravity = 35f;	//how strong/fast gravity will pull you down
	public float airControl = 0.25f;

	[Header("Camera Settings")]
	public GameObject cam; //the camera used for the player. mainly here for the Up/Down look and Clamp.
	public float lookSensitivityX = 2f; // sets the sesitvity of the mouse Left/Right
	public float lookSensitivityY = 0.75f; // sets the sesitvity of the mouse Up/Down
	public float minLookY = -60f; //clamps the player look Down rotaion minimum
	public float maxLookY = 75f;	//clamps teh player look Up rotaton maximum

	Vector3 moveDir = Vector3.zero;

	int jumpTimes;	//how many times the player will be able to jump in the air

	float rotY;	//the rotaion of the camera UP/DOWN
	float rotX;	//the rotation of the camera LEFT/RIGHT

	void Update () // happens every frame
	{
		CharacterController controller = gameObject.GetComponent<CharacterController>(); // gets the character controller attached to the player.

		float ih =  Input.GetAxisRaw ("Horizontal"); // get the input of the horizontal axis (X)
		float iv = Input.GetAxisRaw ("Vertical");	// gets the input on the verticle axis (Z)

		if (controller.isGrounded) // if the player is on the ground
		{ 
			if (Input.GetKey (KeyCode.LeftShift)) //if the Left Shift Key is Held Down Speed will = to Run Speed
			{ 
				speed = runSpeed;
				controller.center = Vector3.zero;
			}
			else if (Input.GetKey (KeyCode.C)) // but if the C key is held down speed will = the couch speed
			{ 
				speed = crouchSpeed;
			} 
			else //if neither of the above keys are being held down speed will = to the defualt Walk speed
			{ 
				speed = walkSpeed;
				controller.center = Vector3.zero;
			}

			moveDir = new Vector3 (ih, 0, iv).normalized; //seting where we want the axis to be modified and how
			moveDir = transform.rotation * moveDir.normalized; // allows the player to be able to rotate and the same speed he moves( i think haha ) 
			moveDir *= speed; // sets how fast the player will move

			jumpTimes = 0; // set jump time to 0 so you are able to jump again

		} 

		if (!doubleJump) //checks if the double jump bool is FALSE
		{
			//Debug.Log ("NormalJump");	// will show if single jump is active (in the console)
			JumpFunc ();	// find and moves through the single jump function
		}

		if (doubleJump) //checks if the double jump bool is TRUE
		{
			//Debug.Log ("DoubleJump");	 // will show if double jump is active (in the console)
			DoubleJumpFunc ();	// find and moves through the double jump function
		}
			
		moveDir.y -= gravity * Time.deltaTime;	// this will move the player downward at the speed on gravity.

		controller.Move(moveDir * Time.deltaTime);	// this will allow the player to actually be able to move.
		Debug.Log (speed); // will show the speed of the player (in the console)

		controller.slopeLimit = maxSlopeLimit;	// this will set the players slope limit to a specified ammount.
	}

	void LateUpdate() //happens every other frame?
	{
		rotX = Input.GetAxis ("Mouse X") * lookSensitivityX;		//Sets up the mouse to look left and right
		rotY -= Input.GetAxis ("Mouse Y") * lookSensitivityY;		//Sets up the mouse to look up and down

		rotY = Mathf.Clamp (rotY, minLookY, maxLookY);	//Clamps the up and down rotation

		transform.Rotate (0, rotX, 0);	//Allows you to look left and right
		cam.transform.localRotation = Quaternion.Euler(rotY, 0, 0);	//Allows you to look up and down (with boundries -- Clamp)
	}
		
	void JumpFunc()	//single jump function
	{
		if (jumpTimes < 1) //see if the amount of times you have jumped is below 1
		{
			if (Input.GetButtonDown ("Jump")) //see if the space bar has been pressed 
			{
				moveDir.y = jumpForce;	// move you upwards ad the speed of "jump force"
				jumpTimes += 1; // +'s 1 on to the jump time so then it will be 1 meaning youll be able to jump one more time which will then make jump time = 2 which is not lower then 2. will not be able to jump again till on the ground
			}
		}
	}

	void DoubleJumpFunc()	//double jump function
	{
		if (jumpTimes < 2) //see if the amount of times you have jumped is below 2
		{
			if (Input.GetButtonDown ("Jump")) //see if the space bar has been pressed 
			{
				moveDir.y = jumpForce;	// move you upwards ad the speed of "jump force"
				jumpTimes += 1; // +'s 1 on to the jump time so then it will be 1 meaning youll be able to jump one more time which will then make jump time = 2 which is not lower then 2. will not be able to jump again till on the ground
			}
		}
	}
}

The simple answer to your question is to have a separate function be called every frame (via Unity’s built-in Update function). This function would allow the user to move left/right independent of jumping. From what I understand, right now you check if the user has pressed the left/right key after/before the jumping script runs. You need to constantly check if the user has pressed the left/right key rather than waiting until your jump happens.