🎮 UnityDocs

Input: leer teclado, ratón y mando

Los dos sistemas de entrada de Unity: el clásico Input Manager (rápido para empezar) y el nuevo Input System (recomendado para proyectos serios). Cuándo usar cada uno y cómo se escribe.

📄 ArtículoIntermedio✅ RevisadoUnity 6.0 LTSActualizado 2026-07-14
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 8 min · ⌨️ Práctica 25 min

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.
Historia: por qué hay dos

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)#

C#
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étodoDevuelve
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
Lee el input en Update, no en FixedUpdate

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.

Error típico en Unity 6

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:

C#
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:

C#
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#

⚖️ Comparativa · Input Manager vs Input System
Input Manager (clásico)Input System (nuevo)
InstalaciónIncluidoPaquete
Curva de aprendizajeMuy bajaMedia
Mando/gamepadLimitadoExcelente
Remapear controlesManual y tediosoDe serie
Multijugador localNoSí (PlayerInput)
Recomendado paraAprender, prototiposProyectos de producción

Errores frecuentes#

  • Leer GetKeyDown en FixedUpdate y 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.

Fuentes y para profundizar