Las prisiones espaciales, desde las que aparecen en novelas clásicas de ciencia ficción como «Las estrellas, mi destino» hasta las de películas más modernas como «Alien 3» ó «Guardianes de la Galaxia» funcionan como potentes metáforas sobre vigilancia extrema y deshumanización de los reclusos. En estos casos los disturbios pueden originarse por auténticas crisis de supervivencia que se dan en las órbitas de planetas perdidos y otros rincones olvidados del universo.
El disturbio es el lenguaje de los que no son escuchados.
Martin Luther King Jr. (1967)
En torno a este tema vamos a desarrollar un prototipo centrado en modelar la toma de decisiones de distintos «prisioneros», que intervienen en disturbios armados que se producen en una prisión imaginaria ubicada en una de las lunas que orbitan en torno a Saturno.
Este prototipo sirve para poner en práctica una de las herramientas de toma de decisiones más populares de la industria: la máquina de estados, concretamente la máquina de estados jerárquica. Además se aprovechará la búsqueda de caminos mediante mallas de navegación y el movimiento mediante comportamientos de dirección y hasta algo de gestión sensorial, pero esta vez aprovechando todo lo posible las herramientas que Unity trae integradas.
Propuesta
La práctica consiste en desarrollar un prototipo de IA para Videojuegos, dentro de un entorno virtual que representa una prisión con varios prisioneros (todos enemigos mortales entre sí) más un grupo de vigilantes robóticos que tratan de poner orden. En este entorno nosotros tenemos que programar a un agente inteligente capaz de percibir, moverse, navegar y decidir, como uno más de los prisioneros de modo que logre maximizar el número de enemigos abatidos y minimizar el número de ocasiones en que él mismo es eliminado (los prisioneros se «regeneran» automáticamente cada vez que mueren… permitiendo así que continúe el juego en un disturbio infinito).
El punto de partida propuesto para esta práctica, con la documentación e implementación (código y recursos audiovisuales) necesaria, se encuentra en este repositorio de GitHub: FPS Online… o mejor aún, en esta versión actualizada para la BotPrize 2026.
En el entorno virtual encontramos varias estancias, siendo estos los elementos más relevantes que podemos encontrar en ellas:
- Prisioneros. Aparecen de alguno de los puntos de regeneración, y pueden ser controlados por jugadores humano o virtuales (bots implementados con técnicas de IA). Pueden moverse, disparar, apuntar, cambiar de arma, saltar, agacharse, correr y hasta usar un propulsor (jetpack) para «volar».
- Armas. Sólo los prisioneros pueden cogerlas y utilizarlas, existiendo de varios tipos.
- Pistola (gun), el arma que todos los prisioneros tienen por defecto.
- Lanzamisiles (launcher), que en realidad lanza unos discos que explotan.
- Fusil de francotirador (sniper), para largo alcance.
- Lanzallamas (flamethower), interesante aunque no haya mecánicas de transmisión de fuego.
- Rifle (rifle), arma más pesada pero más estable.
- Dos pistola (guns), a falta de una.
- Escopeta (shot gun), causa daño en un radio más ancho.
- Utensilios. Como botiquines para recuperar salud o el propulsor para poder «volar» con él.
- Vigilantes robóticos. Hay de dos tipos, las torretas (turrets) y los robots flotantes (hover bots). Las primeras son más poderosas pero permanecen ancladas en sus ubicaciones originales, mientras que los segundos son más débiles pero tienen movilidad. Todos los vigilantes robóticos disparan a los prisioneros y pueden matarlos.
Las características principales del prototipo son:
A. Hay un mundo virtual (la prisión orbital) con un esquema de división de malla de navegación proporcionado por Unity, con las estancias y todos los elementos descritos anteriormente, distribuidos según una serie de puntos representativos del escenario (waypoints). Hay una cámara principal preparada para seguir al protagonista en primera persona desde el comienzo y otra cámara secundaria para tener una vista general de la escena.
B. El agente que controlamos (prisionero) aparece en uno de los puntos representativos del escenario y puede moverse por el escenario con algunas acciones de movimiento descritas anteriormente (al menos moverse, encarar hacia el objetivo y disparar).
C. La navegación del agente aprovecha herramientas integradas en Unity, como la malla de navegación, siendo su comportamiento por defecto tratar de recorrer cautelosamente todas las estancias de la prisión buscando objetos (al menos armas y otros prisioneros a los que atacar con ellas).
D. Para la decisión del agente se usa la infraestructura de una máquina de estados finita jerárquica (aunque sin poder ejecutar estados en paralelo) cuyos estados, transiciones y condiciones concretas (es decir, los datos) se cargan desde un fichero externo (ej. ScriptableObject o cualquier otro formato). La infraestructura es genérica y está programada íntegramente en C# para Unity.
E. En conjunto el agente trata de maximizar la métrica principal del juego que es número de enemigos que he eliminado – número de veces que he sido eliminado, aunque opcionalmente también se podrían mostrar por pantalla otras métricas interesantes como número de armas conseguidas, número de utensilios conseguidos, número de vigilantes robóticos eliminados… todo ello con el contexto de una partida 1 contra 1, que dura X segundos y mantiene un ratio estable de Y fotogramas por segundo.
Revisión
Tener el repositorio a disposición de los profesores con todos los entregables, preparados en tiempo y forma por todos los miembros del grupo de manera equitativa, supone un 10% de la nota de la práctica. Los profesores tendrá una lista con los datos de todos los grupos y los enlaces a las organizaciones en GitHub (por ejemplo IAV00-G02, la del grupo 2 del curso Inteligencia Artificial para Videojuegos 2000-2001) donde se encontrarán los repositorios de las prácticas (IAV00-G02-P1, IAV00-G02-P2 e IAV00-G02-P3).
Revisión de la documentación
En esta primera fase de revisión hay un único entregable:
- Documento de diseño y desarrollo software según la estructura habitual, en el README.md. Supone un 10% de la nota.
Revisión del resultado
En esta segunda fase de revisión los entregables son estos:
- Proyecto con todos los ficheros de código fuente y recursos del proyecto de Unity. Se incluirán enlaces a documentos compartidos en abierto (o con el profesor) mediante Google Drive, desde donde descargar todo lo que por peso o problemas de licencia no pueda mantenerse alojado en GitHub vía Git LFS. Supone un 20% de la nota.
- Fichero con la versión ejecutable para Windows de 64bits (llamado por ejemplo IAV00-G02-P3 1.0.0.zip), publicada como lanzamiento (release) en el repositorio. Cada característica del prototipo (A, B, C, D y E) correctamente implementada supone un 10% de la nota. Además se dejará constancia de sus posibilidades mostrando por pantalla aquellas métricas que permitan valorar la eficiencia de la implementación.
- Documental con las pruebas del juego, añadiendo al documento de producción el enlace a un video oculto en YouTube (llamado por ejemplo IAV00-G02-P3), de menos de 5 minutos de duración, donde queda documentado y comentado por voz y títulos de texto el banco de pruebas realizado. Deberá estructurarse por características (de modo que la sección A1 sea la primera prueba de la característica A, la sección C3 la tercera prueba de la característica C, y así sucesivamente). Supone un 10% de la nota.
Más información
Además de la bibliografía recomendada, se pueden investigar las siguientes referencias. En ningún caso se debe replicar código de terceros sin entenderlo bien y «hacerlo nuestro», y siempre asegurándonos de que funciona exactamente como se requiere en esta práctica.
- Multiplayer Play Mode, asegúrate que lo tienes instalado, de que trabajas exactamente con la versión de Unity que requiere el proyecto (ej. 6000.3.12f1) y configúralo en Window > Multiplayer > Multiplayer Play Mode para ejecutar varias instancias a la vez para hacer pruebas. Tiene que haber un host y N clientes, sólo con un HumanBot; si dejas los campos vacíos usarás la IP 127.0.0.1 (localhost) y un mismo puerto (ej. 7779)
- Unity, Navegación y Búsqueda de caminos
Navegación y Pathfinding (Búsqueda de Caminos) – Unity Manual - Unity 2018 Artificial Intelligence Cookbook, Second Edition (Repositorio)
https://github.com/PacktPublishing/Unity-2018-Artificial-Intelligence-Cookbook-Second-Edition - Unity Artificial Intelligence Programming, 5th Edition (Repositorio)
PacktPublishing/Unity-Artificial-Intelligence-Programming-Fifth-Edition: Unity Artificial Intelligence Programming – Fifth Edition, published by Packt (github.com)
Se pueden realizar ampliaciones para ir más allá en el aprendizaje.
- Permite que al pulsar cierta tecla, el prisionero pueda intercambiar entre ser controlado por el jugador o por la IA.
- Haz que el fichero externo siga un formato tipo JSON, YAML, CSV, XML o textual… con una sintaxis amigable para la edición externa por parte de diseñadores de juego. Puede tener un aspecto como este:
ROOT_STATE: «Mundo»
STATE: «Exploracion»
IS_INITIAL: true
SUB_STATES:
«Patrulla»:
IS_INITIAL: true
ON_UPDATE: «seguir_puntos_ruta»
TRANSITION:
CONDITION: «jugador_en_rango_vision»
TARGET: «Persecucion»
«Persecucion»
ON_UPDATE: «correr_hacia_jugador» TRANSITION:
CONDITION: «jugador_lejos» TARGET: «Patrulla»
TRANSITION:
CONDITION: «distancia_ataque_menor_a_2m»
TARGET: «Combate» # Transición a un estado de nivel superior
… o también podría agruparse cada submáquina en un fichero diferente. - Programa un árbol de comportamiento o un árbol de estado para los prisioneros controlados por IA.
- Crea un escenario con mecanismos más complejos, como puertas y llaves, rampas, etc.
- Mejora el razonamiento del protagonista sobre el estado y la posición de los distintos elementos, con algo de predicción para saber donde estará un enemigo dentro de cierto tiempo y actuar en consecuencia.
- Mejora la gestión sensorial, de manera que el prisionero vea a sus enemigos a través de su propia percepción, razonando también sobre el conocimiento que le aportan esas percepciones.
- Implementar la toma de decisiones con una máquina de estados jerárquica (e incluso paralela) usando Unity Visual Scripting:
https://docs.unity3d.com/bolt/1.4/manual/index.html - Implementar la toma de decisiones con una árbol de comportamiento usando Behavior Designer de Opsive:
https://opsive.com/assets/behavior-designer/
Esta página está licenciada bajo CC BY-NC-SA 4.0 por Laboratorios Narratech.