i don't know why controller.isGrounded is not working and the player change y position when i move some one can help me i m 14 and im new in C# and Unity

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

public class PlayerMovements : MonoBehaviour
{
CharacterController controller;
public float speed = 12f;
public float gravity = 20f;
public float jump = 10f;
Vector3 moveDir = Vector3.zero;
void Start()
{
controller = GetComponent();
}

void Update()
{
    if (controller.isGrounded)
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        moveDir = transform.right * horizontal + transform.forward * vertical;
        if (Input.GetButton("Jump"))
        {
            moveDir.y = jump;
        }

    }
   moveDir.y -= gravity;
   controller.Move(moveDir * speed * Time.deltaTime);
}

}

Probably you need a isGrounded bool variable at the top. And you need to make it false while not jumping.