GameDev #2: Inteligencia artificial. Comprende a tu enemigo

La inteligencia artificial (IA a partir de ahora) en los videojuegos siempre ha estado presente. Desde juegos como el ‘Pong’, donde podíamos jugar contra la máquina, a los juegos de hoy día, donde los soldados buscan coberturas, disparan, se asustan… La evolución ha sido notable, pero el concepto es el mismo, hacer de una entidad de juego que se comporte de una manera similar a un humano. Porque es de lo que se trata, ya que a nadie le gusta jugar con una máquina que gane siempre, hay que darle aleatoriedad, tiene que cometer fallos, sino no seria creíble, y sobre todo, no sería divertido.

Según el juego, la IA debe ajustarse a las necesidades que se requiera. No tiene nada que ver, por ejemplo, una IA que juegue al ajedrez con una IA que representa a un enemigo en un shooter. La primera intenta hacer la mejor jugada posible, utilizando lo que se llama un árbol de heurística, la segunda en cambio, busca que el enemigo parezca humano, y para ello se utiliza una máquina de estados, factores aleatoriosbúsqueda de caminos. Lo que vamos a explicar en este artículo es el funcionamiento de la IA en estos enemigos con comportamiento y aleatoriedad.

El modelo humano

En Max Payne 3, si los enemigos no te ven, siguen patrullando.

Casi todas nuestras reacciones vienen condicionadas por factores externos e internos. Si escuchamos un ruido a nuestra espalda, nos giramos a ver que es, si vemos algo que queremos coger, alargamos el brazo para alcanzarlo. En estos ejemplos, el oído y la vista nos hacen reaccionar a factores externos, en este caso, un ruido o un objeto. Pero además, ante un mismo evento, dos personas pueden tener una reacción diferente, debido a que vemos y oímos las cosas también de diferente forma. Además, existen muchísimos otros factores internos que nos pueden hacer reaccionar de formas muy opuestas, como por ejemplo, el miedo a las arañas, nos hará reaccionar de una manera muy diferente al ver una.

Por lo tanto, si queremos que nuestro enemigo reaccione de forma realista, necesitará percibir esos factores externos. A los distintos factores externos que se pueden percibir, los vamos a llamar inputs. Y a los factores internos que van a modificar los comportamientos ante los mismos inputs, los vamos a llamar variables. Finalmente están las reacciones posibles, las acciones que realizaremos según los inputs y las variables, a lo que vamos a llamar estados. Con estos 3 conceptos se puede modelar el comportamiento de un enemigo, por medio de una máquina de estados.

 La máquina de estados

Una máquina de estados que representa la IA de un enemigo.

La mejor forma de ilustrar lo que es una máquina de estados es que miréis la imagen de la derecha. La imagen representa el diseño posible de la máquina de estados que domina la IA de un enemigo. Como estado inicial podemos poner que el enemigo patrulle una ronda fija, mirando a su alrededor de vez en cuando. Al ver al jugador, su primera reacción es dispararle, como vemos en el diagrama. Patrullar y disparar, son dos estados que representan un comportamiento, y ver al jugador, es el input que le hace reaccionar. ¿Hay alguna variable que pueda modificar el comportamiento? Se podría decir que en este caso, el alcance de la vista del enemigo seria la variable que podría hacer que un enemigo viera al jugador o no, aún en la misma situación.

Los otros estados que parten de ‘disparar’, vienen a reflejar las posibles situaciones en las que se puede encontrar el enemigo en medio de un tiroteo. ‘Recargar’, por ejemplo, dependería también de la cantidad de munición y la velocidad de disparo del arma que lleve en ese momento. Los otros estados, ‘cambiar de lugar’ y ‘buscar cobertura’ son muy similares en la ejecución, que es mover el enemigo, pero con objetivos muy diferentes.

Esta máquina de estados es muy simple. Las de los enemigos de juegos como Max Payne 3, pueden tener muchos más estados y más posibilidades de cambio, por ejemplo, se puede aprovechar la búsqueda de cobertura para recargar una vez se esté a salvo. Además, para dar más realismo, se pueden introducir factores aleatorios para pasar de un estado a otro de forma que parezca que el enemigo, sin ningún motivo aparente, cambia de opinión, cambiando su estrategia. Incluso estados como ‘patrullar’, puede estar compuesto de varios estados como ‘inspeccionar zona’ (quedarse quieto y mirar alrededor)o ‘descansar’ (se apoya en la pared más cercana).

Como veis, la IA en si no es demasiado compleja, la verdadera dificultad de implementar una IA es la detección de inputs y la ejecución de algunas acciones como la búsqueda de cobertura. Lo que más se utiliza, o por lo menos, lo mínimo que debe tener un enemigo con una IA realista, es la capacidad de visión. Y por otro lado, para poder mover el enemigo por el escenario, es necesario la búsqueda de caminos.

La vista de los enemigos

Esta imagen ilustra muy bien lo que es el campo de visión de un enemigo de un videojuego.

Lo que un enemigo ve, en realidad se basa en lo que colisiona con el campo de visión del enemigo. Este viene representado normalmente por una pirámide, ya que es la forma geométrica que tiene menos caras y más se ajusta a la forma del campo visual humano. La razón por la que es bueno que tenga las mínimas caras posibles, es por ser lo más óptimo. El coste del cálculo de colisiones de un polígono con otro, es directamente proporcional al mínimo número de caras que tenga cualquiera de los dos.

El cono que representa la vista del enemigo, se mueve con él, siempre delante de la cara. Se podría decir que es como parte de su cuerpo, pero no se ve, solo se utiliza para detectar cuando el jugador entra dentro de su cono de visión. ¿Pero como se hace para que no te vean si estas detrás de una cobertura?¿Este cono de visión no lo atraviesa todo? Efectivamente, en realidad el enemigo detecta al jugador aun cuando está detrás de una cobertura, pero al detectarlo debe pasar un test de obstáculos. Se lanza un rayo entre el enemigo y el jugador, y si impacta con otra cosa que no sea el jugador, quiere decir que hay algún obstáculo que no le permite verlo, por lo que el enemigo no reacciona, ya que en realidad no lo ha visto.

 La búsqueda de caminos

Esto que veis es un grafo, aunque la forma que tendría el de un nivel seria menos uniforme.

A la hora de realizar una patrulla o que un enemigo busque cobertura, se hacen necesario dos cosas. La primera, que el enemigo pueda navegar por el escenario esquivando obstáculos, y la segunda, que sea capaz de encontrar el camino a su objetivo, como podría ser una cobertura por ejemplo. Esto se resuelve mediante un grafo del nivel, donde los puntos del grafo se sitúan en los puntos de interés, y la linea que une cada punto indica que nuestro enemigo puede caminar desde ese punto al otro. Es la base sobre la que se hacen los cálculos de las rutas.

Cada punto contiene información, por ejemplo, si se trata de una cobertura o no, de forma que los enemigos se situarán en ese punto cuando la busquen. No es que el enemigo detecte la columna y se cubra, más bien es porque le decimos que ahí hay una columna y el enemigo actuará en consecuencia. Si nos equivocamos, y por ejemplo marcamos un punto en medio del pasillo como cobertura, veremos como un enemigo actuará como si hubiese una columna delante suyo, dando una imagen bastante lamentable.

El problema de navegar sin chocar con las paredes, queda resuelto mientras el enemigo siempre camine por las lineas predefinidas. Estas líneas pueden ser todo lo complejas que queramos. Podría ser incluso una maya que envolviera todo el suelo, dando más libertad a la IA pero aumentando la complejidad del grafo. Lo cual dificultaría aun más el segundo problema, la búsqueda de caminos.

El proceso para encontrar el camino más corto no es un problema trivial. Podemos encontrar una solución válida, pero no tiene por qué ser el camino más corto de todos los posibles. El algoritmo A* es el que se suele implementar para encontrar el camino más corto de un punto a otro, decidiendo hacia qué punto ir en cada paso, y recalculando el camino desde cada punto al que se llegue, ya que la situación puede cambiar, y lo que nos hizo valorar que ese camino era el mejor, puede haber sido modificado.

 Conclusiones Finales

Un soldado patrullando por su linea, y Snake fuera de su campo de visión.

Como habéis podido leer, una IA es menos compleja de lo que podría parecer en un primer momento. También hay que pensar que cada enemigo puede tener una máquina de estados diferente, con lo que gestionar una IA avanzada de muchos soldados a la vez puede ser demasiado costoso si no se va con cuidado. Donde está la verdadera fuente de consumo de recursos es en la detección de colisiones (la vista de los soldados por ejemplo) y la búsqueda de caminos.

Seguramente veréis cosas que hacen los enemigos que no están explicadas, pero que seguramente podréis intuir con los conocimientos de este artículo. Por ejemplo, ¿Cómo se implementa el oído de un enemigo? Pues es como la vista pero utilizando la detección de colisiones de una esfera y el punto donde se origina el sonido. Como veis, cambian los sujetos, pero el predicado es el mismo.

Podéis hacer cualquier pregunta en los comentarios, así como proponer esos temas, que siempre os habéis preguntado como funcionan, para futuras entregas de GameDev. Desde GameIt, intentaremos contestar todas vuestras preguntas y estaremos atentos a vuestras propuestas.

 

Salir de la versión móvil