La novela gótica más popular del periodista y escritor francés Gastón Leroux nos sirve como pretexto para abordar el tema de la Decisión en Inteligencia Artificial para Videojuegos. El personaje que da nombre a la novela es, más que un villano, un antihéroe. Erik es un músico deforme que vive escondido en los subterráneos del Palacio Garnier, la casa de la ópera. Suele encerrarse en una sala secreta para componer su gran obra, y sueña con que sea interpretada por la gran diva del canto Christine Daaé, con la que está obsesionado. Para ello, no dudará en secuestrarla y obligarla a memorizar el libreto si hace falta: tiene hasta la celda preparada. Sin embargo existen dos obstáculos importantes para los planes del monstruo. El primero es el público de la ópera pues, debido a su aspecto, Erik odia ser visto por otras personas (que suelen aterrorizarse al verle) y prefiere permanecer en el anonimato; por eso se desplaza utilizando pasadizos ocultos y pequeñas barcas con las que cruza las zonas inundadas de los sótanos del edificio, siendo capaz de derribar las lámparas del patio de butacas con tal de ahuyentar a los espectadores. El segundo obstáculo que enfrenta Erik es el vizconde Raoul de Chagny, un joven y atractivo pretendiente de Christine que hará todo lo posible por frustrar los propósitos del fantasma.
El escenario de la famosa novela de Leroux El fantasma de la ópera (1910) tiene su origen en una ópera real de París sobre la que el autor había escuchado rumores desde que finalizó la construcción del edificio. Los detalles sobre el Palacio Garnier de París y los rumores que lo rodean están estrechamente vinculados en el relato de Leroux. El lago subterráneo sobre el que escribe en su novela es exacto al que se encuentra bajo esta casa de la ópera, y que aún se utiliza para enseñar a los bomberos de la ciudad a nadar en la oscuridad. El infame accidente de la lámpara que acontece en la historia también resultó ser cierto. En general, es verdad que los misterios que Leroux narra en su novela acerca del Fantasma siguen siendo misterios. Sin embargo, él defendió aquellos rumores como ciertos, incluso en su lecho de muerte.
Sobre el autor y el contexto de El fantasma de la ópera (1910)
Esta vez vamos a desarrollar un prototipo centrado en las decisiones del fantasma, que será el agente inteligente con el comportamiento más complejo de este proyecto. Su objetivo es secuestrar a la cantante, llevarla a una celda secreta que tiene preparada para ella, encerrarla allí, y poder así seguir trabajando confiado en su gloriosa (y a la vez interminable) obra maestra. La diva, por su parte, trabaja sobre el escenario aunque en el descanso entre las escenas, se retira a las bambalinas. El fantasma la aterroriza y es incapaz de ofrecer resistencia alguna si la captura. Su amigo el vizconde, por el contrario, la ayuda a volver a las tablas. Precisamente el avatar que controla el jugador es el vizconde, capaz de moverse por todas partes y poner remedio a todos los males que haya podido causar el fantasma (poniéndole trabas a este también). El vizconde recoloca lámparas caídas (viles atentados del fantasma para expulsar al público), rescata a la cantante de su celda, e incluso se puede ensañar con la guarida del fantasma, golpeando los muebles (¡y el piano!) de la sala de música, haciendo enfurecer terriblemente a esta malvada figura. Si, como jugadores, no intervenimos frente a las tropelías del fantasma, este no tardará en ahuyentar al público, secuestrar a nuestra ‘prima donna’, y seguir impunemente con su febril actividad artística.
Este prototipo servirá para probar los paradigmas de toma de decisiones tanto con máquinas de estado como con árboles de comportamiento, los dos más populares de la actualidad. Además se recurrirá a la búsqueda de caminos mediante mallas de navegación, comportamientos de dirección y hasta gestión sensorial, pero esta vez aprovechando todo lo posible las herramientas que trae integradas Unity.
Propuesta
La práctica consiste en desarrollar un prototipo de IA para Videojuegos, dentro de un entorno virtual que represente la ópera de París, con un agente inteligente (el fantasma) que decide, se mueve y actúa según lo que encuentra en sus diferentes estancias, otros agentes más simples como la cantante y el público, y un avatar, el vizconde -némesis del fantasma-, controlado por el jugador.

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: IAV-Decision.
En el entorno virtual encontramos las siguientes estancias, describiendo también los elementos más relevantes que podemos encontrar en ellas, y su comportamiento:
- Patio de butacas (P). Es la estancia inicial del público, dividido en dos bloques (este y oeste). Cada bloque chilla a la mínima que vea al fantasma sobre el escenario, pero permanecerá en su sitio salvo que caiga la lámpara gigante del techo correspondiente (hay lámpara este y oeste), en cuyo caso ese lado del patio de butacas se oscurecerá y los espectadores huirán despavoridos al vestíbulo. No regresarán hasta que no se vuelva a colocar su lámpara. Esta estancia está conectada con el escenario (visibilidad y navegabilidad, como indica la arista negra), con el vestíbulo, y es visible desde los palcos este y oeste, aunque el público no puede alcanzar a ver bien si hay alguien en los palcos, ni aunque estén las dos lámparas encendidas.
- Vestíbulo (V). Es la zona más externa de la ópera, donde van los bloques de público cuando se asustan. Simplemente conecta con el patio de butacas.
- Escenario (E). Es la estancia inicial de la cantante, donde se dedica a su oficio, aunque lo intercala (cada pocos segundos) con un descanso que realiza tras las bambalinas, una estancia contigua. Además también conecta con el patio de butacas y los palcos, y es posible dejarse caer por una trampilla al sótano oeste, aunque no sea posible regresar. El fantasma no pisará ninguna estancia como esta mientras haya público mirando. Eso sí, tanto en esta estancia como en otras puede “capturar” (coger al hombro) a la cantante, incluso compartiendo estancia con el vizconde y llevársela a donde quiera, soltándola por voluntad propia o porque se sienta intimidado por el “choque” con nuestro héroe. Si la cantante acaba en una estancia que no esté conectada con el escenario, se sentirá confusa y merodeará (pasando de estancia a estancia aleatoriamente), dejándose “rescatar” por el vizconde en caso de que lo vea cerca, con la esperanza de que la lleve hasta una estancia que conozca, para poder retomar así su ritmo normal de trabajo.
- Bambalinas (B). Estancia donde suele descansar la cantante y que conecta con el escenario, el sótano oeste y que permite deslizarse por una rampa algo oculta al sótano este, sin posibilidad de regresar.
- Palco oeste (Po). Estancia inicial del vizconde, personaje que controla el jugador y que gusta disfrutar desde aquí de la función. El palco tiene una palanca que se puede usar para dejar caer la lámpara oeste del patio de butacas. Conecta con el escenario, con el sótano oeste y permite ver el patio de butacas, aunque debido a la altura no existe visibilidad en el sentido opuesto. El vizconde puede moverse con libertad, como el fantasma, también sobre las barcas cercanas. Puede usar palancas y chocar contra el fantasma, intimidándole y haciendo que retroceda durante unos pocos segundos (y suelte a la cantante si la llevaba). Puede golpear muebles, como los de la sala de música, haciendo un ruido tremendo que se escuchará en toda la zona subterránea. Puede interactuar con una lámpara caída, para arreglarla automáticamente (colocándola en su sitio), y también con la cantante, cogiéndola en brazos automáticamente y llevándola consigo, o dejándola en el suelo a voluntad (interactuando sin que haya una palanca delante ni otra cosa así).
- Palco este (Po). Estancia similar al palco oeste, con una palanca que se puede usar para dejar caer la lámpara este del patio de butacas. Conecta con el escenario, con el sótano este y permite ver el patio de butacas, aunque sin visibilidad en el otro sentido.
- Sótano oeste (So). Estancia que conecta con el palco oeste, con las bambalinas y con el sótano norte, aunque para recorrer esta conexión hace falta subirse a una barca. Sólo una persona (tal vez con otra al hombro o en brazos) puede montarse sobre la barca a la vez y sólo si esta se encuentra atracada en la orilla de esa estancia. Por defecto, la barca que se necesita aquí comienza atracada en la otra orilla, en la del sótano norte, y aunque en todas las orillas siempre hay una palanca que permite acercarla, el proceso de “recuperar” la barca es algo lento (mayor coste). Se puede llegar a esta estancia desde el escenario, pero no al revés.
- Sótano este (Se). Estancia que conecta con el palco este, y tanto con el sótano norte como con la sala de música donde compone su obra el fantasma, aunque para recorrer estas dos últimas conexiones hacen falta barcas. Por defecto, la barca que lleva al sótano norte sí está en esta orilla, pero la que lleva a la sala de música está en la orilla contraria. Aunque se puede llegar a esta estancia desde las bambalinas, por una trampilla, desde aquí no se conecta con las bambalinas.
- Celda (C). Estancia donde el fantasma deja a la cantante para completar su secuestro con éxito, usando una palanca que activa unas rejas que la impiden salir (y que por supuesto el vizconde podrá desactivar). Conecta con el sótano norte.
- Sótano norte (Sn). Estancia que conecta con la celda, además de con la sala de música, el sótano este y el sótano oeste a través de sus correspondientes tres barcas.
- Sala de música (M). Estancia inicial del fantasma, donde le gusta pasar tiempo componiendo su ópera. Conecta mediante una barca con el sótano este, y con otra con el sótano norte. El fantasma tiene el objetivo principal de secuestrar a la cantante, para lo que intentará buscarla en las bambalinas, en el escenario o si no logra dar con ella, explorando las demás estancias meticulosamente por si estuviera “perdida” por allí. No puede acceder al escenario si hay público mirando, de modo que, como objetivo secundario, necesita tirar las dos lámparas del techo para vaciar del todo el patio de butacas. Sea como sea, una vez atrapada la cantante, la llevará consigo hasta la celda, intentando usar siempre el camino con menor coste (recordando la última posición de las barcas y del vizconde que conoce, y eligiendo la ruta con menor coste, la que tenga más barcas a su favor y que evite al héroe de esta historia). Cuando llega hasta la celda la soltará allí, activará las rejas e irá hasta la sala de música, permaneciendo allí indefinidamente. Lo único que desconcentra al fantasma cuando está componiendo es escuchar a su musa cantar de nuevo en el escenario, reavivando sus deseos de secuestrarla y encerrarla otra vez en su celda. Por otro lado, si el fantasma llega a percibir el ruido de los golpes del vizconde a su piano, abortará la misión que esté haciendo (soltando a la cantante) y correrá enfurecido hasta allí para dedicar unos segundos a arreglar semejante estropicio.
Las características principales del prototipo son:
A. Hay un mundo virtual (la casa de la ópera), con un esquema de división de malla de navegación proporcionado por Unity, donde se ubican todos los elementos descritos anteriormente. El vizconde es controlado por el jugador mediante el ratón y un único clic derecho para interactuar con otros elementos. Hay cámaras que siguen a cada uno de los personajes, incluyendo una que nos dé la vista general del entorno.
B. Cada mitad del público huye tras la caída de su lámpara, y regresa en cuanto esta ha sido arreglada. Esto se hace con una navegación y un movimiento triviales, sin apenas decisión.
C. La cantante es un agente inteligente basado en una máquina de estados que pasa del escenario a las bambalinas cuando toca, que puede ser “llevada” por los otros dos personajes hasta otra estancia, que merodea desorientada cuando está en las estancias subterráneas, y que se deja llevar por el vizconde, con la esperanza de reencontrar el escenario y continuar su rutina allí. Tiene navegación, movimiento y percepción sencillos, y decisión mediante máquina de estados
D. El fantasma funciona mediante un árbol de comportamiento complejo, para buscar a la cantante, tirar las lámparas para deshacerse del público, capturar a la chica, llevarla a la celda, activar las rejas para encerrarla, etc.
E. El fantasma también cuenta con un sistema de gestión sensorial para reaccionar a lo que realmente ve (en la propia estancia o en otras que son visibles para él) y oye (el canto de su musa, el grito del público, el ruido de la sala de música…), sin tener que recurrir a información privilegiada sino únicamente recordando lo que ha ido viendo por el mundo.
Condiciones
A la hora de desarrollar el proyecto es obligatorio:
- Atenerse a nuestras recomendaciones generales en la realización de prácticas.
- Documentar claramente los algoritmos, heurísticas o cualquier “truco” utilizado. La documentación deberá ser adecuada (datos correctos, resumen completo del enunciado, descripción del punto de partida con suficiente detalle, investigación de posibles referentes…) e incluir el diseño de la solución mediante diagramas y/o pseudocódigo de Millington (similar a Python), así como el reparto del trabajo y el esfuerzo.
- El ejecutable será práctico y fácil de usar, comprendiendo -con la calidad mínima esperable en el prototipo de un videojuego- las características principales anteriormente descritas, además de los recursos audiovisuales adecuados para representar el entorno y a los distintos agentes.
- Diseñar y programar de la manera más organizada, genérica y elegante posible, separando totalmente la parte visual e interactiva del juego (preferentemente programada visualmente), del modelo y las técnicas de IA implementadas (preferentemente programadas en C# o con herramientas de autoría específicas). Sin olvidar los comentarios en los encabezados y a lo largo de todos los métodos.
- Utilizar únicamente las herramientas de Unity y a lo sumo los plugins de terceros proporcionados por los profesores, sin reutilizar código ajeno a estos.
- Limitarse, en la medida de lo posible, a los recursos del punto de partida proporcionado por el profesor, evitando el uso de recursos audiovisuales pesados, extraños, o que ralenticen la ejecución.
- Personalizar la interfaz con el número de grupo, nombre de los alumnos u otros rasgos inequívocos en el contenido del juego que subrayen la autoría sobre el resultado.
- Para realizar las pruebas y facilitar las revisiones de los profesores, intentando aprovechar el esfuerzo de desarrollo, conviene crear una interfaz gráfica cómoda para mostrar distintos escenarios de ejemplo, instrucciones de uso, etc. Por ejemplo, habilitando una “consola de trucos” (o teclas rápidas) que permitan ver los datos de los desarrolladores, reiniciar la ejecución, cambiar la cámara, establecer situaciones específicas para hacer pruebas, hacer invencible al avatar, etc. El manejo debe ser ágil e intuitivo para poder realizar rápidamente todas las pruebas con aquellas variaciones que puedan resultar interesantes.
- El prototipo debe ser funcional y su manejo usable, preferiblemente con mando y con teclado, para poder realizar de manera rápida, intuitiva y frecuente todas las pruebas necesarias.
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 IAV23-G02, la del grupo 2 del curso Inteligencia Artificial para Videojuegos 2022-2023) donde se encontrarán los repositorios de las prácticas (IAV23-G02-P1, IAV23-G02-P2, etc.).
Los entregables son:
- Documentación del proceso de producción según la estructura habitual, en el README.md. Supone un 10% de la nota.
- Todos los ficheros de código fuente y recursos del proyecto Unity. Se incluirá un enlace a una carpeta compartida con los profesores de Google Drive (llamada por ejemplo IAV23-G02-P3) desde donde descargar todo lo que por peso o problemas de licencia no deba mantenerse alojado en GitHub. Se tendrán en cuenta las buenas prácticas de desarrollo software (commits frecuentes en la rama principal, organización de recursos en el proyecto y de objetos en la escena, escritura sistemática de los comentarios en todas las clases y métodos, etc.). Supone un 20% de la nota.
- Fichero con la versión ejecutable para Windows de 64bits (llamado por ejemplo IAV23-G02-P3 1.0.0.zip), publicada como “lanzamiento” 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: en este caso, cantidad de estados en la máquina de estados y de tareas/nodos en el árbol de comportamiento, tareas ejecutadas con éxito y tareas ejecutadas con fracaso, tiempo tardado en completar con éxito cada fase del secuestro fantasmal.
- Enlace a un video oculto en YouTube (llamado por ejemplo IAV23-G03-P3), de menos de 5 minutos de duración, donde quede documentado y comentado por voz y/o subtítulos todo 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.
- Opsive, Behavior Designer
https://opsive.com/assets/behavior-designer/ - Unity, Bolt Visual Scripting
https://docs.unity3d.com/bolt/1.4/manual/index.html - Unity, Navegación y Búsqueda de caminos
https://docs.unity3d.com/es/2021.1/Manual/Navigation.html - 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.
- Crea un escenario con geometría 3D compleja, con portales que unen distintas zonas y saltos insertados en la malla de navegación. Plantea tener un cargador de niveles (construidos modularmente) desde fichero.
- Crea un escenario con mecanismos más complejos, como botones que abren y cierran pasadizos, puertas giratorias, ascensores o rampas controlados por temporizadores, etc. También puedes crear barcas de 2 plazas y hacer que la cantante ocupe su propia plaza y haya que ubicarla debidamente antes de usar la barca.
- Mejora el razonamiento del fantasma sobre el estado y la posición de los distintos elementos (las barcas, la cantante, el vizconde, etc.), de modo que pueda tomar decisiones más inteligentes, considerando los efectos causados por otros personajes.
- Mejora la gestión sensorial, de manera que el fantasma vea y oiga a los personajes no necesariamente compartiendo estancia, razonando también sobre el conocimiento que le aportan esas percepciones, y mostrando realimentación visual para que quede claro lo que conoce el fantasma.
- Plantea incluir varios fantasmas y varias cantantes, funcionando de manera simultánea. Incluso plantea algún nuevo personaje para la historia.