Robot movement

Hello, I’m having an issue with my game controller. I’m trying to make my robot jump while maintaining inertia. I’ve made some progress, but the issue is that when my robot rotates, the jump movement doesn’t work anymore. It stays trapped, and when I press jump, it jumps backward.

My code is this, in case anyone needs it (it’s used on a cube without a Rigidbody):

using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class botija : MonoBehaviour
{
    public Camera playerCamera; // Referencia a la cámara del jugador
    public float walkSpeed = 6f; // Velocidad de caminata
    public float runSpeed = 12f; // Velocidad de carrera
    public float jumpPower = 7f; // Potencia del salto
    public float gravity = 9.8f; // Gravedad aplicada al personaje
    public float lookSpeed = 1f; // Velocidad de rotación de la cámara
    public float lookXLimit = 45f; // Límite de rotación vertical de la cámara
    public float defaultHeight = 2f; // Altura por defecto del personaje

    private Vector3 moveDirection = Vector3.zero; // Dirección de movimiento
    private CharacterController characterController; // Componente CharacterController del personaje

    private bool canMove = true; // Bandera para permitir el movimiento
    private bool isJumping = false; // Bandera para indicar si el personaje está saltando

    private float storedSpeedX; // Nueva variable para almacenar la velocidad en X
    void Start()
    {
        // Obtener el componente CharacterController adjunto al GameObject
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        // Obtener la dirección hacia adelante y hacia la derecha según la rotación del personaje
        Vector3 forward = transform.TransformDirection(Vector3.forward);

        float movementDirectionY = moveDirection.y; // Guardar la dirección Y del movimiento actual

        // Determinar si el jugador está corriendo
        bool isRunning = Input.GetKey(KeyCode.LeftShift);



        // Saltar si se presiona el botón de salto y el personaje está en el suelo
        if (Input.GetButton("Jump") && canMove && characterController.isGrounded)
        {
            moveDirection.y = jumpPower;
            isJumping = true; // Establecer la bandera de salto

        }
        else
        {
            moveDirection.y = movementDirectionY;
            if (characterController.isGrounded)
            {
                isJumping = false; // Restablecer la bandera de salto cuando el personaje esté en el suelo
                if (canMove)
                {
                    // Calcular la velocidad actual de movimiento en el eje Z
                    float curSpeedX = canMove && !isJumping ? (isRunning ? runSpeed : walkSpeed) * Input.GetAxis("Vertical") : 0;
                    moveDirection = (forward * curSpeedX); // Calcular la dirección de movimiento
                    storedSpeedX = curSpeedX;

                    transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Horizontal") * lookSpeed, 0);
                }
            }
            else
            {
                moveDirection.y -= gravity * Time.deltaTime; // Aplicar la gravedad si el personaje no está en el suelo

                moveDirection.z = storedSpeedX;

                moveDirection.x = 0;
            }
        }
         // Mover el personaje según la dirección calculada
        characterController.Move(moveDirection * Time.deltaTime);

        // Rotar la cámara y el personaje si se permite el movimiento y si no esta saltando

    }
}