Reformando la IA

La semana pasada pasé un buen rato mejorando la IA, en especial, el sistema de percepción. Había contado incialmente con RAIN para esa tarea, sin embargo, la falta de soporte me hizo descartar este plugin que parecía tan prometedor. Tocaba entonces hacer todo a mi manera, desde cero.
El concepto inicial empleaba un script para cada tipo de entidad en la escena. El sistema funcionaba, pero no era para nada óptimo reescribir código iguales o muy parecidos para cada posible IA. Toda una burrada de mi parte, así que decidí unificar todo en un solo script, trabajo que terminé ayer. Ahora la personalización de la IA dependerá de un conjunto de datos pasados al script, los cuales aún no acabo de definir.
Tengo algunas ideas al respecto, pero todo muy vago. Cada entidad debería tener nociones de algunos lugares relevantes (por ejemplo, dónde patrula, o a dónde retirarse durante la noche), cómo reaccionar ante el jugador, y sobre facciones, enemigos, etc.
De paso, descubrí una serie de problemas en el sistema de percepción, que también arreglé. Mi método, muy sencillo, se basa en usar un BoxCastAll para detectar todo lo que está delante de la entidad:

var hits = Physics.BoxCastAll(new Vector3(gameObject.transform.position.x, gameObject.transform.position.y + 5.0f, gameObject.transform.position.z + 5.0f), new Vector3(25, 10, PerceptionRange*5.0f), gameObject.transform.forward, Quaternion.identity, 120.0f);

A continuación hay que procesar esa lista de resultados a ver si el jugador u otro NPC están incluidos. Ojo, que además hay que revisar si una entidad ya no es visible. Muy burdo, pero funciona, y se aceptan sugerencias (aunque sé que no recibiré ninguna).
Por el momento he logrado que los NPC ignoren al jugador, se acerquen a hablar con él, o se lancen a atacarlo. Falta pulir, precisamente, que se acerquen adecuadamente, algo que será necesario también para el combate. Sobre eso espero tener resultados pronto.

Comentarios