Input del jugador con GetKey y GetAxis

Resumen

El input del jugador es el corazón de cualquier videojuego: sin él, no hay interacción y, por lo tanto, no hay juego. En Unity, la clase Input te permite leer botones, teclas y ejes para que tu jugador realmente pueda comunicarse con lo que ocurre en pantalla. Si estás aprendiendo gameplay programming, este es uno de los pilares que necesitas dominar.

¿Qué hace la clase Input en Unity?

La clase Input (con I mayúscula) centraliza la lectura de cualquier dispositivo de entrada conectado a tu juego: teclado, mouse o gamepad. Desde ahí puedes detectar pulsaciones de teclas, ejes analógicos y más.

Las instrucciones de Input deben llamarse desde un script asociado a un GameObject, y casi siempre se ejecutan dentro del método Update, porque ese método corre cada frame y necesita escuchar al jugador en tiempo real.

¿Por qué Input.GetKey va en Update y no en Start? Porque Start solo se ejecuta una vez al iniciar el juego, mientras que Update corre cada frame y permite escuchar al jugador continuamente. [02:55]

¿Cómo detectar botones con GetKey, GetKeyDown y GetKeyUp?

Los botones son entradas discretas: están presionados o no, así que devuelven una señal booleana. Unity te ofrece tres variantes para leerlos según el momento exacto que te interese capturar [00:42].

  • Input.GetKeyDown: devuelve true solo en el frame en que el jugador empieza a presionar la tecla. Ideal para acciones que se disparan una sola vez, como saltar o disparar.
  • Input.GetKey: devuelve true en cada frame mientras la tecla siga presionada. Útil para acciones sostenidas, como mantener el escudo arriba.
  • Input.GetKeyUp: devuelve true únicamente en el frame en que el jugador suelta la tecla. Perfecto para soltar una flecha tensada o liberar un golpe cargado.

Para probarlo, basta con un script sencillo dentro de Update:

csharp if (Input.GetKeyDown(KeyCode.Space)) { Debug.Log("Hola, mundo"); }

Si presionas espacio durante cinco segundos, ese mensaje se imprime una sola vez. En cambio, con Input.GetKey verás el log repetirse en cada frame mientras mantengas la tecla [04:30].

¿Cómo funcionan los ejes con Input.GetAxis?

Los ejes representan controles analógicos, como el stick de un gamepad, que pueden devolver valores positivos o negativos según la intensidad y dirección del movimiento [02:00].

Con Input.GetAxis("Horizontal") detectas movimiento lateral, y con Input.GetAxis("Vertical") detectas el vertical. Lo interesante es la diferencia entre teclado y gamepad:

  • En teclado: izquierda devuelve -1, derecha devuelve +1, sin estados intermedios.
  • En gamepad: obtienes todo un rango entre -1 y +1, por ejemplo 0.05 o 0.1 si mueves el stick suavemente para una misión de stealth.

Unity ya viene configurado para que GetAxis lea ambos dispositivos sin que tengas que cambiar de código.

¿Qué diferencia hay entre GetKey y GetAxis? GetKey lee botones binarios (presionado o no), mientras que GetAxis devuelve un valor entre -1 y 1 que refleja la intensidad de un control analógico.

¿Cómo conectar el input a un componente del juego?

Leer el input es solo la mitad del trabajo: la otra mitad es traducirlo en acciones sobre los componentes de la escena. Un buen ejemplo es controlar un bate con HingeJoint para golpear pelotas generadas por un prefab.

La idea es que al presionar espacio, el bate gire a 180 grados, se mantenga ahí mientras la tecla siga presionada y vuelva a 0 al soltarla. La propiedad clave aquí es JointSpring.targetPosition, dentro del componente HingeJoint.

¿Por qué no puedo modificar joint.spring.targetPosition directamente?

Unity arroja el error: "no puedo modificar el valor de retorno de hingeJoint.spring porque no es una variable". Esto pasa porque spring devuelve una struct (JointSpring), no una referencia editable, igual que ocurre con transform.position.x [09:10].

La solución es trabajar con una variable intermedia:

csharp public HingeJoint joint;

void Update() { JointSpring spring = joint.spring; if (Input.GetKey(KeyCode.Space)) { spring.targetPosition = 180; } else { spring.targetPosition = 0; } joint.spring = spring; }

Guardas el spring en una variable, modificas su targetPosition y luego lo reasignas al joint. Es el mismo patrón que usas cuando quieres cambiar la X de una posición.

Cómo usar la documentación de Unity para resolver dudas

Un consejo práctico: cuando algo no funcione, busca en Google "hinge joint Unity script" y entra al apartado Script Reference, no al Manual. El Manual es para configuración en el editor; el Script Reference te muestra cómo manipular el componente desde C# [10:30].

Antes de programar, intenta resolver el problema en el editor moviendo valores manualmente. Una vez que sepas qué propiedad cambia el comportamiento, llévalo al script. Ese flujo te ahorra horas de depuración.

No olvides arrastrar el GameObject correspondiente al campo público de tu script en el inspector. Sin esa referencia, el código compila pero no hace nada, como pasó con el bate antes de asignarle el joint.

¿Ya probaste construir tu primer mini juego con estas instrucciones? Cuéntame en los comentarios qué mecánica se te ocurre programar con GetKey, GetAxis y un HingeJoint.