VISITAS:

martes, 29 de junio de 2021

El Input Manager de Unity

El Input Manager es el sistema que tenía Unity hasta ahora gestionar la entrada desde diversos dispositivos: teclado, touch, ratón, joystick...

En 2021 Unity ha introducido un nuevo sistema: el Input System, más versátil, soporta nuevos dispositivos, soporta entrada multi-usuario y es más configurable. Sin embargo, el nuevo Input System es más complejo de usar debido fundamentalmente a su versatilidad, y por eso, el Input Manager se sigue y se seguirá usando mucho tiempo como gestor de dispositovs de entrada en Unity.

En este post revisaremos el antiguo Input Manager de Unity, porque creo que en una gran parte de juegos no es necesaria la versatilidad del nuevo Input System.

Cómo maneja Unity la entrada

La pregunta es ¿necesitamos realmente un sistema para gestionar la entrada en Unity? Al fin y al cabo, es posible escuchar y detectar eventos de entrada directamente utilizando la clase Input:

void Update() {
    if (Input.GetKeyDown(KeyCode.Space)) {
         // spacebar pressed
    }
    if (Input.GetMouseButtonDown(0)) {
        // left mouse button pressed
    }
}

Este método funciona correctamente.
El problema es que si queremos cambiar la tecla espacio por otra tecla o bien por un botón del joystick, entonces tendríamos que cambiar todos los scripts donde se utilice esta entrada.
La solución es utilizar un sistema de entrada modular: la entrada que dispara una acción se separa del script que la procesa. De esta forma, se definen acciones, las cuales se asocian a diversas entradas (teclado, ratón, joystick...), y los scripts utilizan estas acciones para manejar el juego. Así, el script, en lugar de mirar una tecla concreta, mira una acción (en otro sitio, la acción se asocia a una o más entradas). Las acciones son algo como: "Fire", "Horizontal", etc
De esta forma, es fácil cambiar o añadir los mecanismos de entrada sin tocar los scripts, ya que basta con cambiar las asociaciones que tiene una acción.



El Input Manager de Unity

El Input Manager es un sistema de gestión de entradas modular. Consta de dos partes:
  • Input Manager
  • Input Class
La clase Input es la que utilizan los scripts para recoger la entrada: Input
El Input Manager es la ventana de settings de Unity (Edit -> Project settings) donde se asignan botones, teclas y movimientos (los dispositivos reales) a las entradas virtuales (acciones que utilizan los scripts)

Cómo recibir entradas en un script

Los scripts pueden "escuchar" las acciones utilizando los métodos de la clase Input.
Imaginemos un script que permite "disparar" cuando el jugados pulsa la tecla espacio. La forma directa de implementarlo (sin Input Manager) es:

void Update() {
    if (Input.GetKeyDown(KeyCode.Space)) {
        // disparar
    }
}

Esto funciona, pero como hemos visto, tiene algunos inconvenientes.

Con el Input Manager podemos utilizar una acción ya existente, por ejemplo "Fire1" (también podemos crear nuevas acciones), y la asociamos a la tecla de espacio. En el script escucharemos la acción "Fire1".

  1. Abrimos Project settings > Input Manager: Aquí tenemos todas las acciones predefinidas: "Horizontal", "Vertical", "Fire1", etc. Podemos añadir nuevas acciones cambiando el Size.
  2. Abrimos la acción "Fire1"
  3. Cambiamos el Input Type: Key or Mouse Button
  4. Cambiamos Positive button a space. Para ver otras posibilidades: Documentación del Input Manager




Ahora, después de configurar el Input Manager, ya podemos escribr un script que escuche eventos de tipo "Fire1" con la clase Input:

void Update() {
    if (Input.GetButtonDown("Fire1")) {
        // disparar
    }
}

NOTA: Usamos GetButtonDown que retorna true en el primer frame que se haya pulsado la tecla espacio (pero no en los demás frames). Sin embargo, GetButton devuelve true en todos los frames que se mantiene la tecla pulsada.

Usando el Input Manager es fácil cambiar la entrada física asociada a una acción sin tener que tocar los scripts que usan esta entrada. Además, también se pueden añadir otras entradas físicas asociadas a la misma acción, soportando así múltiples controles para la misma acción (y sin tener que tocar los scripts).

Múltiples entradas asociadas a la misma acción

Como hemos dicho, se pueden asociar varios dispositivos de entrada a una misma acción del Input Manager. Por ejemplo, "Fire1" tiene asociada la tecla espacio, pero podemos hacer que se dispare "Fire1" por ejemplo al pulsar el botón izquierdo del ratón.
Tenemos que crear una nueva acción. Para esto, cambiamos el Size sumando uno más al Size actual. Abajo aparecerá una acción nueva que tenemos que rellenar. El campo más importante que hay que rellenar es Name, donde pondremos "Fire1", o sea, el mismo nombre que tiene la acción que estamos tratando. Los demás datos son los que definen la entrada física. De esta forma, tenemos una acción "Fire1" asociada a dos entradas físicas distintas.

NOTA: Hay otra posibilidad para que una acción esté asociada a dos entradas físicas distintas: Alt Positive Button. En este campo podemos poner otra entrada distinta que se asociará la acción. Utilizar este campo Alt no es muy correcto y Unity recomienda utilizar estos campos para botones secundarios de un mismo dispositivo.

Uso de Axis en el Input Manager

Hasta ahora hemos visto dispositivos de entrada de tipo On/Off, o sea, que están activados o no. Pero el Input Manager también maneja dispositivos tipo Axis, los cuales nos dan un valor entre -1 y +1. El valor de reposo es 0.
Los dispositivos de tipo Axis se tratan igual que los de tipo On/Off en un script, excepto que el valor retornado está en [-1 .. +1]

void Update() {
    arriba = Input.GetAxis("Vertical")
    giro = Input.GetAxis("Horizontal")
}

En realidad, los dispositivos tipo On/Off retornan también un valor entre 0 y +1, igual que los Axis, pero en este caso normalmente sólo nos interesa chequear si está en reposo (valor 0) o no (valor mayor que 0).