miércoles, 2 de diciembre de 2015

NodusNodus


Durante el desarrollo del prototipo de Northern Lights surgió la necesidad de diseñar un sistema para que el personaje que te sigue durante la partida, lo hiciese de tal forma que diera la sensación de que tiene conocimiento del entorno. 
Queríamos que fuese capaz de viajar por el mapa de un punto aleatorio hasta donde se encontrase el personaje controlado por el jugador y que tuviese la habilidad de decidir cual era el camino más corto y libre de peligros.
Naturalmente, al tratarse de un proyecto de fin de curso, no teníamos demasiado tiempo para dedicarle a la creación de esta inteligencia artificial y tuvimos que hacer algunos apaños que funcionasen pero que no eran lo que queríamos para nuestro juego, así que quedó pendiente en la lista de cosas por rehacer y mejorar.

Imaginemos que tenemos una red de nodos y queremos que un personaje viaje desde su posición hasta un destino en concreto, y que lo haga siguiendo una red de nodos creada con anterioridad.


En la imagen se representaría el caso en el que el personaje quiere llegar hasta su destino y tiene 2 caminos: El rojo y el azul.
En este caso, el camino rojo sería el más corto ya que el recorrido pasa por 3 nodos y el camino azul pasa por 4 nodos.
Nuestro personaje seguiría el camino marcado en rojo hasta llegar a su destino.
Para realizar la búsqueda del camino más corto, utilicé algoritmos para recorrer colas (queue) que retornasen el camino más corto entre 2 nodos incluidos en la cola.

Una vez llegado a este punto, me encontré un problema mayor: La construcción de la red de nodos en Unity3D.
Tal y como diseñe incialmente el algoritmo, cada nodo era un GameObject que contenía un script que contenía un array de otros nodos, para indicar con qué nodos estaba conectado.
La tarea de construir una estructura de GameObjects uno a uno, definiendo sus conexiones una a una arrastrando objetos en el editor de unity, se me hizo insoportable.
No podíamos perder tanto tiempo en realizar una red de nodos, y tampoco era viable que cada nodo constituyera un GameObject de la escena.

Así que me puse a trabajar en NodusNodus (NN).
NN es una herramienta aún en desarrollo que te permite generar una red de nodos de tamaño cualquiera, con tantas conexiones como necesites .
Con ella, puedes generar nodos con un simple click en tu escena de unity, eliminarlos, unir varios nodos entre si, etc.
Soporta multi-selección de nodos para editar varios simultáneamente.


Ahora que tengo terminada la base de la herramienta, se me ocurren otros campos donde podría serme útil, no solo para la IA de nuestros personajes.

  • Travelings de cámara para cinemáticas.
  • Generar caminos para enemigos que patrullen.
  • Easings.
  • Crear geometrías. De momento esta herramienta funciona solo en 2D, pero añadir la tercera dimensión es trivial.
  • etc...

Cualquier cosa que requiera de Vértices o posiciones en la escena.
De momento continuaremos con su desarrollo y esperamos poder subirla a la AssetStore de Unity para que cualquiera pueda aprovecharse de las ventajas que ofrece.