Ejemplo de un controlador básico usando Input System + CharacterController.

Script

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMovement : MonoBehaviour
{
    [Header("Referencias")]
    [SerializeField]
    private InputActionReference moveAction;

    [SerializeField]
    private InputActionReference jumpAction;

    [SerializeField]
    private Transform camara;

    [Header("Movimiento")]
    [SerializeField]
    private float velocidad = 5f;

    [SerializeField]
    private float velocidadRotacion = 10f;

    [Header("Salto")]
    [SerializeField]
    private float gravedad = -20f;

    [SerializeField]
    private float alturaSalto = 2f;

    private CharacterController controller;
    private float velocidadVertical;

    void Awake()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        Vector2 input =
            moveAction.action.ReadValue<Vector2>();

        Vector3 forward = camara.forward;
        Vector3 right = camara.right;

        forward.y = 0f;
        right.y = 0f;

        forward.Normalize();
        right.Normalize();

        Vector3 direccion =
            forward * input.y +
            right * input.x;

        direccion = Vector3.ClampMagnitude(
            direccion,
            1f
        );

        if (direccion.sqrMagnitude > 0.001f)
        {
            Quaternion objetivo =
                Quaternion.LookRotation(direccion);

            transform.rotation =
                Quaternion.Slerp(
                    transform.rotation,
                    objetivo,
                    velocidadRotacion *
                    Time.deltaTime
                );
        }

        if (controller.isGrounded &&
            velocidadVertical < 0f)
        {
            velocidadVertical = -2f;
        }

        if (controller.isGrounded &&
            jumpAction.action.WasPressedThisFrame())
        {
            velocidadVertical = Mathf.Sqrt(
                alturaSalto * -2f * gravedad
            );
        }

        velocidadVertical +=
            gravedad * Time.deltaTime;

        Vector3 movimiento =
            direccion * velocidad;

        movimiento.y = velocidadVertical;

        controller.Move(
            movimiento * Time.deltaTime
        );
    }
}

Qué incluye


Para mejorar después

Podés agregar: