Sistema de IA básico terminado

En los últimos días parece que no tengo otro tema. De hecho, me duermo pensando en esto, y entre IA y Divinity, mi sueño es bastante incómodo. Pero el resultado es que el sistema de inteligencia artificial funciona bastante bien a nivel básico. O sea, que como prueba de concepto está bien, y ahora es que las cosas empiezan a  complicarse.
Para continuar, tengo que implementar un mini-sistema RPG: habilidades e items utilizables por las entidades, incluyendo al jugador; que aunque sea mini, no es trivial. De paso, eso me permitirá probar otro enfoque en la implementación de habilidades y objetos usando ScriptableObjects. Sí, otra obsesión reciente, quizás debería consultar un médico. Y ya que hablamos del tema, este video ofrece un buen punto de partida:

Al principio me pareció que no sacaría nada útil, pero resultó que estaba equivocado. Hay algunos trucos, como el de instanciar los ScriptableObjects que no sabía con exactitud cómo hacerlo, y el de usar Resource.LoadAll para cargar todos los ScriptableObjects de una carpeta.
El siguiente paso sería conseguir que los NPC utilicen sus habilidades (nada de optimizaciones por el momento) y objetos para derrotar al jugador. Luego, combate entre grupos. Y entonces, si todo lo anterior camina como debe y no he encontrado algún error garrafal, ir al punto de optimizar el combate, lo cual requiere un sistema de items mucho más completo y funcional, bonificadores y penalizadores, etc. Suficiente trabajo para un mes, creo.
No estoy seguro de que necesite corutinas en algún momento, aunque la idea me ha rondado por la cabeza un par de veces. Quizás no dentro de las acciones, pero sí en el StateManager, para no sobrecargar el juego cuando una entidad tenga más de una acción en su estado activo. Hay que tener en cuenta que ahora las acciones son simples, pero en el futuro se volverán mucho más complejas a medida que necesiten valorar factores diversos con vistas a hacer la IA más inteligente. Ojalá no se vuelvan necesarias.
Pensaba dar algunas conclusiones, pero creo que aún es demasiado prematuro y las dejaré para más adelante. Aún estoy a tiempo de toparme con algún problema insoluble que me haga descartar todo el trabajo.

Usando ScriptableObjects para IA

Hace unos meses el canal de Unity publicó una serie de videos, basados mayormente en esta conferencia:


Hasta hace poco no había tenido tiempo de estudiar los tutoriales y comenzar a adaptar el código, o incluso decidir si era mejor que mi anterior intento. Y recién hace dos días fue que pude mirar un poco más lo que había hecho y cambiar algunas cosas.
En esencia, el sistema me parece bastante bueno. Por lo menos resuelve el problema de la modularidad de la IA, algo que no había logrado resolver en mi aproximación anterior. Confieso que últimamente he dudado de los ScriptableObjects, pero creo que en este caso sí son muy útiles. Para un RPG, poder definir comportamientos específicos para cada entidad es esencial. Por ejemplo, un mago no pelea de la misma forma que un guerrero de largo alcance, que a su vez es muy distinto a un guerrero cuerpo a cuerpo, y así sucesivamente, según las clases o el equipo de cada NPC.
Los tutoriales muestran de forma relativamente sencilla cómo armar una máquina de estados usando ScriptableObjects y cómo solucionar el problema que se deriva de que éstos guardan la información entre corridas. Pero además, la conferencia abunda un poco más en otros trucos que podemos hacer con ScriptableObjects, usándolos como enums, por mencionar uno.
Yo recomiendo ver la conferencia primero y luego los tutoriales, si estás buscando una guía para desarrollar tu propia inteligencia artificial. Y ya que hablamos del tema, tengo que decir que la IA de Divinity: Original Sin 2 es genial. Me encanta cómo los NPCs encuentran siempre la mejor forma de fastidiarte, buscando lugares elevados, lanzando a tus compañeros en el fuego, etc. La verdad, no recuerdo haber visto un sistema tan avanzado de combate.

Divinity: Original Sin 2 no es de mundo abierto

Un poco decepcionante, la verdad, aunque hay que admitir que no está tan mal. Luego de varios días uno se percata de que este RPG en realidad no es de mundo abierto, sino más bien lineal. Me recuerda un poco The Witcher 2, donde tenías que ir de ubicación en ubicación y resolver todo antes de pasar a la siguiente. Lo que se queda atrás se pierde.
Las ventajas de este enfoque son que la línea temporal de la historia es más fácil de controlar, y la trama en sí es más simple. No hay tantas bifurcaciones, salvo las que se desprenden de las decisiones del jugador. En un mundo abierto no hay mucho orden, un jugador puede ir primero a un lugar y luego a otro, y otras personas podrían hacerlo a la inversa. Todo un reguero.
Esta es una situación que he experimentado escribiendo mis intentos de guión para RPGs abiertos. ¿Cuándo se dispara un evento importante, por ejemplo, un mensaje para realizar una misión? ¿Y si el jugador nunca viene a determinado lugar? ¿Y si liquida a X NPC antes de que se le asigne la misión? Todas esas son preguntas a las que hay que darle solución (no respuesta, porque en principio, cualquier respuesta debería ser válida).
En fin, un dolor de cabeza que involucra a programadores y escritores. Lo cual me recuerda que aún no he logrado diseñar un sistema de gestión de misiones que valga la pena.

Otra reseña

Un breve post para avisar que me acaba de llegar otra reseña, esta es la primera fuera de Cuba. Tengo que agradecer a Marita, del blog Monalisa a los 40, por dedicar el tiempo y el esfuerzo para leerse el texto y darnos sus opiniones.

Documental sobre CDPRED/Unity 2017.2

Dos breves antes del fin de semana: si no han estado siguiendo la serie de documentales de Noclip sobre CDPRED/The Witcher, deberían hacerlo. Incluso Marcin Iwinski, uno de los fundadores de CD Projekt, es entrevistado (en el documental anterior dedicado a la primera entrega de la saga no aparecía), y los siguientes capítulos abarcan hasta la tercera parte del juego.
En mi opinión, un excelente material sobre la historia de esta compañía desarrolladora de videojuegos y su buque insignia, que no deben perderse. En serio. Hay algunas perlas de sabiduría perdidas por ahí si sabes prestar atención, como suele suceder cuando una docena de personas te hablan acerca de cómo construyeron algo.
Lo otro es que ayer salió Unity3d 2017.2. La lista de cambios solo trae algo interesante: soporte para tilemaps. Al fin, carajo. También hay que mencionar otra cosita como Cinemachine 2D. La lista de mejoras, por supuesto, es más grande, pero no vi nada que me resultara interesante o extremadamente necesario para mis proyectos actuales. Me da la impresión de que últimamente, los de Unity se centran en machacarnos con Cinemachine, como si tuviesen algún tipo de trastorno obsesivo con eso. Vale, macho, que ya sabemos que tienes Timeline y Cinemachine desde hace rato, no hace falta que en cada convención me expliques que puedo hacer una peli con eso.
Y completamente fuera del tema: ya tengo Divinitiy: Original Sin 2, y me lo estoy pasando en grande. Incluso estoy tratando de volver a los años 90, cuando no había internet (¿que sí había, dices? pues sería en tu país, porque aquí, ahora mismo en el 2017 no se puede decir con total seguridad que haya internet) y no mirar ningún walkthrough. Un RPG genial, de esos que solo se ven uno al año.  Pero supongo que si eres rolero no te estaré diciendo nada nuevo. Y si no lo eres... no te sientas triste. Es posible que haya algún hobby esperándote en el futuro para llenar esa vida tan vacía que llevas.

Jugar, cuando eres zurdo

No soy zurdo, por suerte. Pero un pequeño problema, que espero que sea temporal, me ha obligado desde hace varios meses a darle un poco de reposo a la mano derecha. Revisando un antiguo proyecto que uso para experimentar ideas, descubrí que, aparte de tener el código de la cámara isométrica desactualizado, no me había preocupado en verificar qué tan factible es jugar cuando tienes que manejar el mouse con la mano izquierda y desplazar la cámara con la derecha. Sobre todo, si no has implementado los controles adecuados del lado derecho del teclado.
Sí, era un código puesto a toda prisa, ni siquiera mi última versión  de la cámara isométrica. Ese es el problema de la accesibilidad: no nos percatamos de que falta hasta que nos afecta directamente. Es muy difícil valorar lo que necesita alguien que es zurdo, carece de una mano, no ve los colores o simplemente no ve nada, si nosotros mismos no sufrimos esas carencias.
En mi caso, ha sido necesario pasar varios meses volviéndome zurdo poco a poco incluso para descubrir el valor de jugar con un mando de Xbox y lo mucho que me faltaba por aprender a la hora de diseñar interfaces compatibles con mandos.
Por suerte, en este caso la solución es trivial y tampoco es que sea algo prioritario. Como les decía, es un proyecto de pruebas y con cambiar el mouse de lugar basta. Lo que sí trataré de tener esto en cuenta para proyectos más serios.