Improving Input

Mejorando el input

La primera tarea de la segunda iteración de «Gäelith. The Voice of the Stones» que abordé fue añadir la posibilidad de manejar al personaje principal del juego usando un gamepad, además de las opciones ya contempladas de teclado y botones en la UI.
En principio, se trataba de una tarea sencilla que no debería haberme llevado mucho tiempo, pero decidí aprovechar la oportunidad para refactorizar todo el sistema de interacción y gestionarlo con el Input System, el nuevo estándar de Unity.

El momento adecuado para el cambio

Aunque el Input System existe desde Unity 2019, no ha sido hasta la llegada de Unity 6 que se ha convertido en el estándar dentro de la instalación básica del motor. Esta transición representa un cambio de paradigma en cómo se manejan las entradas en los proyectos de Unity, y como el principal objetivo de mi proyecto es aprender todo lo posible, me pareció que añadir el gamepad era la excusa perfecta para meterme en harina con el nuevo sistema.

Ventajas del Input System frente al Input Manager

Input System representa un auténtico cambio de filosofía frente al anterior Input Manager. La forma de enfocar la interacción con el usuario es muy diferente, más versátil, y sin duda ofrece numerosas ventajas que intentaré resumir a continuación:

  • Soporte multiplataforma integrado: Una de las ventajas más notables es la facilidad para implementar controles estandarizados para consolas, PC, dispositivos móviles o proyectos de realidad virtual. Diferentes esquemas de control pueden convivir en el mismo proyecto de Unity, haciendo que el desarrollo multiplataforma sea mucho más fluido.
  • Configuración visual intuitiva: El Editor de Acciones de Entrada (Input Actions Editor) permite una configuración rápida con una interfaz visual amigable. Proporciona acceso a un conjunto de interacciones y procesadores incorporados, o incluso la posibilidad de personalizarlos según las necesidades del proyecto. Esta interfaz visual hace que la configuración de los controles sea mucho más intuitiva que con el antiguo sistema.
  • Funcionalidades avanzadas por defecto: El nuevo sistema viene con opciones avanzadas como reasignación de teclas en tiempo de ejecución, entradas independientes para cada individual, varios esquemas de control, facilidad para multijugador local, detección automática de entrada y entrada de alta frecuencia sub-frame. Todas estas características habrían requerido una implementación personalizada con el Input Manager antiguo.
  • Extensibilidad mediante API: El Input System ofrece una API de scripting de bajo nivel que permite añadir soporte para dispositivos personalizados. También facilita la creación de herramientas de prueba como bots o pruebas automatizadas para agilizar la producción.

Creando un asset personalizado

A pesar de que Unity proporciona un asset genérico –InputSystem_Actions-, decidí crear mi propio asset personalizado por dos razones principales:

  • Control total: Al diseñar mi propio sistema de entrada, tengo control completo sobre cada aspecto de cómo funciona la interacción con el usuario.
  • Aprendizaje: Como Gäelith es también un proyecto de aprendizaje, crear mi propio asset me permite entender completamente cómo funciona el Input System en lugar de usar una solución prediseñada.

En primer lugar creé un nuevo asset de acciones de entrada utilizando el editor visual que proporciona Unity y posteriormente definí los mapas, acciones y enlaces específicos para mi juego.
Una vez configurado el asset, utilicé las definiciones para hacer referencia a mis acciones de manera segura desde el código C#, sin tener que usar cadenas de texto para buscarlas. Esto reduce la posibilidad de errores y hace que el código sea más robusto.

Ajustes en el control del personaje

Inicialmente contemplé la posibilidad de utilizar el joystick izquierdo del gamepad para mover al personaje, pero al ser de momento un movimiento «discreto», de casilla en casilla, esta opción no resultaba intuitiva y finalmente me decanté por el D-Pad.
De igual forma, refactoricé la entrada «continua» del movimiento del personaje: eliminé el chequeo de datos de entrada en cada frame y lo sustituí por eventos. De esta forma, consumo menos procesador y evito que el movimiento del personaje sea demasiado alocado: ahora se mueve paso a paso, de forma más coherente. Si en un futuro permito que el personaje tenga un tipo de movimiento más libre, volveré a la opción sin eventos.

La importancia del Single Responsibility Principle

Un aspecto que facilitó enormemente esta transición fue haber aplicado desde el principio el Single Responsibility Principle en la arquitectura del juego. Gracias a esta arquitectura, solo tuve que modificar el código específicamente relacionado con la entrada del usuario. Todo el resto del código que afecta al personaje, como el movimiento en sí mismo o las acciones, no se vieron afectados por este cambio. Esto demuestra el valor de una buena arquitectura de software, especialmente al realizar cambios importantes como este.

Conclusión

Sin duda, el nuevo sistema resulta más flexible, más seguro y más fácil de usar que el anterior. La interfaz visual y la capacidad de generar automáticamente clases a partir de los assets de acciones facilitan enormemente el trabajo del desarrollador. Y si además se pretende soportar múltiples plataformas y dispositivos de entrada, Input System es la opción a elegir.

No esperes más tiempo y prueba a manejar a Gäelith con tu gamepad.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *