Dos sistemas, elige según el proyecto#
Unity tiene dos formas de leer la entrada:
- Input Manager clásico (
UnityEngine.Input): simple, sin instalar nada. Perfecto para aprender y prototipos. - Nuevo Input System (paquete): más potente y flexible (mando, rebind de teclas, varios jugadores, eventos). Recomendado para proyectos que vayan en serio.
El sistema clásico existe desde siempre pero se queda corto con mandos modernos, remapeo de controles y multijugador local. Unity creó el Input System como paquete para resolverlo. Ambos conviven; en proyectos nuevos, el nuevo es la apuesta a futuro.
Sistema clásico (rápido para empezar)#
void Update()
{
// Ejes: valor entre -1 y 1 (teclas WASD/flechas, stick)
float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical");
// Una tecla, solo el fotograma en que se pulsa
if (Input.GetKeyDown(KeyCode.Space))
Debug.Log("¡Salto!");
// Mientras se mantiene pulsada
if (Input.GetKey(KeyCode.LeftShift))
Debug.Log("Corriendo");
// Ratón (0 izquierdo, 1 derecho, 2 central)
if (Input.GetMouseButtonDown(0))
Debug.Log("¡Disparo!");
}| Método | Devuelve |
|---|---|
GetAxis("Horizontal") | -1 a 1, suavizado |
GetAxisRaw("Horizontal") | -1, 0 o 1, instantáneo |
GetKeyDown(tecla) | true el frame en que se pulsa |
GetKey(tecla) | true mientras está pulsada |
GetKeyUp(tecla) | true el frame en que se suelta |
GetKeyDown/GetMouseButtonDown solo son true durante un fotograma. Si los lees en FixedUpdate puedes perderte la pulsación (recuerda que FixedUpdate no corre exactamente una vez por frame). Léelos en Update y, si necesitas actuar en física, guarda un flag para consumirlo en FixedUpdate. Ver Update vs FixedUpdate.
Si un proyecto tiene activo solo el nuevo sistema y usas Input.GetAxis, verás "You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System". Ve a Edit → Project Settings → Player → Active Input Handling y ponlo en Both para que convivan.
Nuevo Input System#
Primero instala el paquete Input System desde el Package Manager. La forma más rápida de leer un dispositivo directamente:
using UnityEngine;
using UnityEngine.InputSystem;
public class MovimientoNuevo : MonoBehaviour
{
void Update()
{
var teclado = Keyboard.current;
if (teclado == null) return; // por si no hay teclado
if (teclado.spaceKey.wasPressedThisFrame)
Debug.Log("¡Salto!");
Vector2 mov = Vector2.zero;
if (teclado.aKey.isPressed) mov.x -= 1;
if (teclado.dKey.isPressed) mov.x += 1;
// Mando (si hay)
var pad = Gamepad.current;
if (pad != null)
mov = pad.leftStick.ReadValue();
}
}Input Actions (la forma recomendada)#
El verdadero potencial está en los Input Actions: defines acciones abstractas ("Saltar", "Mover") en un asset y las mapeas a teclas/botones/sticks. Así el jugador puede remapear controles y tu código no depende de teclas concretas:
using UnityEngine;
using UnityEngine.InputSystem;
public class Jugador : MonoBehaviour
{
[SerializeField] private InputActionReference mover; // acción "Mover"
void OnEnable() => mover.action.Enable();
void OnDisable() => mover.action.Disable();
void Update()
{
Vector2 dir = mover.action.ReadValue<Vector2>();
transform.Translate(new Vector3(dir.x, 0, dir.y) * 5f * Time.deltaTime);
}
}Comparativa#
| Input Manager (clásico) | Input System (nuevo) | |
|---|---|---|
| Instalación | Incluido | Paquete |
| Curva de aprendizaje | Muy baja | Media |
| Mando/gamepad | Limitado | Excelente |
| Remapear controles | Manual y tedioso | De serie |
| Multijugador local | No | Sí (PlayerInput) |
| Recomendado para | Aprender, prototipos | Proyectos de producción |
Errores frecuentes#
- Leer
GetKeyDownenFixedUpdatey perder pulsaciones. - No comprobar
Keyboard.current != null(puede no haber dispositivo). - Mezclar los dos sistemas sin poner Active Input Handling en Both.
- Codificar teclas fijas en vez de usar acciones (impide remapear).
Resumen#
Para aprender rápido, el Input Manager clásico (Input.GetAxis, GetKeyDown) sobra. Para un proyecto serio con mando y controles remapeables, el nuevo Input System con Input Actions es la mejor inversión. En ambos casos, lee el input en Update.