Controlador de jugador básico en Unity

Clase 7 de 60Curso Avanzado de Creación de RPGs con Unity

Resumen

Aprende a crear un controlador de jugador en Unity paso a paso: desde configurar el Input Manager hasta programar el movimiento en C# con Input.GetAxisRaw, Mathf.Abs, Time.deltaTime y transform.Translate. Con este enfoque, tendrás un movimiento fluido en horizontal y vertical, listo para iterar en tu roguelike.

¿Cómo preparar el Input Manager para el movimiento en Unity?

Unity ofrece por defecto 18 ejes de entrada para mapear hardware a código. Aquí se usan los ejes Horizontal y Vertical: flechas izquierda/derecha o A/D para horizontal, y flechas arriba/abajo o W/S para vertical. Es clave recordar sus nombres exactos: Horizontal (H mayúscula) y Vertical (V mayúscula).

  • Usa los ejes predefinidos del Input Manager.
  • Confirma las teclas: flechas y alternativas WASD.
  • Verifica mayúsculas en los nombres de ejes.

¿Qué necesita el Player Controller en C# para empezar?

Se crea un script C# llamado PlayerController (sin espacios) y se arrastra al objeto del jugador. Se edita en Visual Studio. La variable public float speed controla la velocidad; al ser pública, puedes ajustarla desde el editor. Un valor inicial recomendado: 4.0f. También se definen constantes para evitar errores de escritura en los nombres de ejes.

  • El script controla el personaje con flechas o WASD.
  • La velocidad puede variar: incluso con un power up podría duplicarse.
  • Constantes: evitan confundir mayúsculas y minúsculas.

Ejemplo de declaración de variables y constantes:

public class PlayerController : MonoBehaviour
{
    public float speed = 4.0f; // velocidad por defecto.

    private const string horizontal = "Horizontal";
    private const string vertical = "Vertical";

    void Update()
    {
        // Movimiento se implementa aquí.
    }
}

¿Cómo programar el movimiento con Update y Time.deltaTime?

El movimiento usa la ecuación de física espacio = velocidad × tiempo: el desplazamiento depende de speed y de Time.deltaTime (tiempo desde el último frame). Se lee la entrada con Input.GetAxisRaw y se aplica un umbral para evitar ruido del hardware.

¿Por qué usar un umbral con Mathf.Abs > 0.5?

Los dispositivos no son perfectos: pueden generar pequeñas vibraciones. En lugar de comprobar > 0, se usa Mathf.Abs(valor) > 0.5f para iniciar el movimiento solo cuando hay una presión clara de la tecla.

  • Evita desplazamientos indeseados por ruido.
  • Acepta entradas parciales sin exigir valor 1.0.

¿Cómo mover en horizontal y vertical con transform.Translate?

Se comprueba cada eje por separado. Si supera el umbral, se traslada el transform en el eje correspondiente. Horizontal mueve en X; vertical mueve en Y; Z se mantiene en 0. Si pulsas dos teclas a la vez, se mueve en diagonal.

void Update()
{
    // Horizontal.
    float h = Input.GetAxisRaw(horizontal);
    if (Mathf.Abs(h) > 0.5f)
    {
        transform.Translate(new Vector3(h * speed * Time.deltaTime, 0f, 0f));
    }

    // Vertical.
    float v = Input.GetAxisRaw(vertical);
    if (Mathf.Abs(v) > 0.5f)
    {
        transform.Translate(new Vector3(0f, v * speed * Time.deltaTime, 0f));
    }
}
  • Uso de Input.GetAxisRaw: lee la cantidad de pulsación.
  • Uso de Time.deltaTime: mantiene movimiento suave por frame.
  • Uso de transform.Translate: aplica el vector de desplazamiento.

Además, verás en el editor la variable speed en el componente del jugador y podrás ajustar la sensación de control. El movimiento inicial es simple: permite salir de pantalla y aún no hay animación, pero sienta una base sólida para pulir el control.

¿Te gustaría mejorar este controlador con desaceleración, límites de pantalla o animaciones? Comenta qué te gustaría implementar a continuación.