Mover un personaje en Unity con inputs de teclado, mouse o gamepad es la base de cualquier videojuego en tercera persona. Aprenderás a leer ejes de movimiento, rotar la cámara con el mouse y disparar acciones con clics, todo dentro de un script en C#.
¿Cómo funciona el movimiento de un cubo con vectores direccionales?
La lógica empieza con un script llamado movimiento tercera persona que mueve un cubo en la escena usando dos variables: direccionHorizontal y direccionVertical. Ambas inician en cero y, al multiplicarlas por los vectores globales right y forward, definen hacia dónde se desplaza el objeto.
Cuando una de estas variables toma un valor negativo, el vector se voltea. Multiplicar Vector3.right por menos uno produce un vector que apunta hacia la izquierda. Lo mismo sucede con Vector3.forward: si la dirección vertical es negativa, el cubo retrocede.
Estas variables no deben superar el rango entre menos uno y uno, porque cualquier valor mayor sobrepasaría la velocidad esperada del personaje. Y aquí entra Time.deltaTime, que multiplica el desplazamiento para que el movimiento no dependa del frame rate de la máquina [01:35].
¿Qué es Time.deltaTime en Unity? Es el tiempo en segundos que tardó el último frame en renderizarse. Multiplicarlo por la velocidad asegura que el movimiento sea constante sin importar si el juego corre a 30 o 144 fps.
¿Cómo leer el teclado y el gamepad con Input.GetAxis?
Para que el cubo responda a controles reales, se reemplazan los valores manuales por Input.GetAxis. A diferencia de los botones, este método no usa key codes sino strings con el nombre del eje [03:05].
csharp
direccionHorizontal = Input.GetAxis("Horizontal");
direccionVertical = Input.GetAxis("Vertical");
Los ejes "Horizontal" y "Vertical" ya vienen configurados en Unity y leen tres dispositivos al mismo tiempo:
- Las flechas direccionales del teclado.
- Las teclas W, A, S, D.
- El stick analógico del gamepad.
La gran ventaja del stick es que es analógico. Si lo mueves muy poquito, la variable devuelve un número muy pequeño, como menos cero punto uno, y el cubo avanza despacio. Si lo empujas al máximo, llega a uno o menos uno, y el personaje alcanza su velocidad tope [04:40].
¿Qué otros movimientos se pueden tratar como ejes?
El mouse también funciona como dos ejes independientes. Su movimiento horizontal corresponde al eje "Mouse X" y el vertical al eje "Mouse Y". Esto permite usarlo para rotar la cámara como en cualquier juego en primera o tercera persona.
¿Cómo rotar la cámara con el movimiento del mouse?
En un nuevo script llamado movimiento con mouse, se crean dos variables públicas, mouseX y mouseY, que se actualizan dentro del método Update leyendo los ejes del mouse [05:50].
csharp
mouseX = Input.GetAxis("Mouse X");
mouseY = Input.GetAxis("Mouse Y");
transform.Rotate(mouseY, mouseX, 0);
La primera versión del código rota la cámara en el eje vertical usando mouseX y en el eje horizontal usando mouseY. Es importante mapear cada eje del mouse al eje correcto del transform: el movimiento horizontal del mouse rota alrededor del eje Y, y el vertical rota alrededor del eje X.
Un detalle clave: los valores devueltos por los ejes del mouse no se multiplican por Time.deltaTime. Esto es así porque ya representan un delta del propio dispositivo, es decir, cuánto se movió el mouse entre frame y frame [07:50].
¿Por qué no se multiplica el mouse por Time.deltaTime? Porque el valor que entrega Input.GetAxis("Mouse X") ya es un desplazamiento por frame. Si lo multiplicaras, el movimiento se haría dependiente del frame rate y se sentiría inconsistente.
¿Cómo detectar los clics del mouse en Unity?
Para los botones del mouse existe Input.GetMouseButton, que funciona parecido a GetKeyDown y GetKeyUp. Recibe un número entero que identifica cada botón:
- 0 corresponde al clic izquierdo.
- 1 corresponde al clic central.
- 2 corresponde al clic derecho.
Mientras el botón esté presionado, el método devuelve true. Esto permite encadenarlo con una acción de movimiento, como avanzar el personaje hacia adelante a cinco metros por segundo [09:25].
csharp
if (Input.GetMouseButton(0)) {
transform.Translate(0, 0, 5 * Time.deltaTime);
}
Aquí sí se multiplica por Time.deltaTime, porque el cinco es una constante de velocidad y necesita escalarse al tiempo real entre frames. Con esa lógica armas un astronauta flotando en el espacio que activa su mochila propulsora cada vez que haces clic.
¿Qué es el nuevo Input System de Unity?
Unity ofrece dos sistemas de entrada: el clásico, que ya viene configurado y es el que usamos en este flujo, y un nuevo sistema más potente. El nuevo Input System permite manejar cualquier gamepad con controles normalizados, lo que significa que un mismo código funciona para mandos de Xbox, PlayStation o genéricos.
La contra es que requiere más configuración inicial. La ventaja del input clásico es que ya está listo: con solo Input.GetAxis y los nombres por defecto puedes mover a tu personaje con cualquier stick o tecla. Si planeas hacer cosas más complejas, vale la pena revisar la documentación del nuevo sistema.
¿Qué tipo de movimiento te gustaría implementar primero en tu propio juego? Cuéntalo en los comentarios.