viernes, 23 de julio de 2010

Aventuras con Unity – Encontrando el camino...

Pues continuando con la tesis...

Como había comentado anteriormente, el objetivo a lograr es que los personajes salgan de una base y se dirijan hacia otra base, pero hay varias cosas que hay que tener en cuenta, por ejemplo:

  • La posición de las bases varía.
  • Hay obstáculos en el camino.
  • Los personajes deben salir en filas de 4
  • Todos los personajes de la misma fila deben llegar a la base destino al mismo tiempo
  • Los personajes no deben de chocar con otros personajes que estén transitando.
  • Los personajes deben de evitar el chocar con otras bases que estén en el camino.
  • Los personajes deben evitar el chocar con los obstáculos que encuentren en el camino.

Como pueden ver hay que tener en cuenta varias cosas y con los intentos hasta ahora hechos solamente he logrado el punto 1, 3 y 5, así que todavía falta un muy buen tramo para lograr tener el traslado de los personajes por el mundo a punto, entonces manos a la obra.

A fin de lograr que los personajes no colisionen ni con los obstáculos ni con las bases pude ver dos opciones:

1.Aplicar una fuerza constante al personaje y hacer las bases redondas a fin de que cuando se encuentre alguna pues llegue el momento en el que lo salve de forma automática.
2.Implementar un algoritmo de busqueda de camino y aplicarlo a cada personaje para que pueda evadir obstaculos y bases.

La primer opción es bastante mala ya que solo funciona con las bases, no funciona con los obstáculos, además de que los personajes pueden trabarse o perderse y nunca llegar al destino, así que solo sirve como prueba. Pueden ver a lo que me refiero en el Tercer Intento, si se fijan en la luneta de la mitad es redonda y esto permite que los personajes de alguna forma puedan evadirlo, pero deben de chocar con la base para lograrlo.

Debido al éxito no encontrado con la opción 1 tuve q pensar en otra solución y Victor me ayudó comentándome que ya existen implementaciones de algoritmos d búsqueda de caminos y me mandó un link con la implementación del algoritmo A*(A estrella o A star) en Unity.

Para los que no sepan ni que onda con ese algoritmo de forma rápida y sencilla les explico, es un algoritmo que recibe un punto de inicio y un punto final, los cuales tenemos nosotros, y tiene la forma de caminar un paso y saber cuanto le costó caminarlo, de tal forma que comienza a dar pasos siguiendo cierto camino, si ese camino no llega al punto final entonces da un paso hacia atrás e intenta caminar por otro lado, de tal forma que intenta dar pasos por cualquier camino disponible y una vez que llega al punto final sabe cuanto le costó el llegar al final.

Este algoritmo nos garantiza que si existe un camino del punto A al B lo va a encontrar y si quieres, puede calcular el camino óptimo, es decir, el camino que cueste menos caminar.

Aquí esta la definición en la Wikipedia A - Estrella
Aquí esta un ejemplo visual de la implementación del algoritmo en la resolución de un juego A - Extrella

Una vez explicado lo anterior, pues ahora si que me dí a la tarea de bajar la implementación de esta liga: A - Pathfinding

Ya teniendo la última versión pues pasé a realizar el proyecto de ejemplo el cual es bien básico, se trata de un plano de 50mt cuadrados sobre el cual se calcula una malla, donde cada intersección se considera un nodo y el algoritmo A* calcula el camino óptimo siguiendo los nodos para llegar del nodo A al B. Bueno, quizas es un poco mas omplicado que eso, sin embargo me permite ver buenos resultados rápidamente, aquí les dejo la implementación del proyecto básico utilizando la implementación de Aron Granberg:

Astar 1


Para hacer que camine hay que darle click en alguna parte del terreno.
El click no debe ser encima de un obstáculo.
Pueden dar otro click antes de que llegue al destino y se calculará el nuevo camino a partir del punto en donde se encuentra el personaje.

Bueno, hasta aquí le dejaré por lo pronto, es emocionante ver resultados con esta implementación, afortunadamente puedo usarlo en proyectos no comerciales y logicamente tendré que adaptarlo a mis necesidades, pero ya es un gran avance.

Epero sus comentarios, sugerencias y demás, por lo pronto nos seguimos leyendo...

No hay comentarios: