Tengo un juego 2D de arriba hacia abajo donde la IA genera en los bordes del mapa y corre hacia el centro.
Estoy usando A * y una malla de nodos para hacer la búsqueda de ruta.
En este momento, la IA genera en un punto en el borde del mapa y todos toman el mismo camino, que es la ruta más corta hacia el centro.
Ahora quiero que sean más sorprendentes e interesantes y tomen diferentes caminos entre sí.
Puedo pensar de inmediato en dos ideas para hacer esto, pero ¿quería saber si hay otras formas o formas mejores que la gente usa a menudo?
Cuando un enemigo genera y genera un camino hacia el centro, aumente temporalmente el costo de todos los nodos en ese camino, luego disminuya lentamente hacia abajo con el tiempo. Entonces la IA enemiga que engendra más tarde se verá obligada a tomar un camino más amplio.
Sin embargo, el enfoque anterior conducirá a la IA a tomar un camino cada vez más amplio y aún será muy predecible. Así que pensé que también introduciría una serie de nodos de objetivos intermedios alrededor del mapa. Cuando la IA aparece, escogen aleatoriamente uno de los objetivos intermedios y se dirigen allí primero antes de dirigirse al centro del mapa. ¿Combinar esto con el enfoque anterior de aumentar los costos podría verse bastante bien?
¿Qué enfoques han encontrado las personas que funcionan mejor para lograr que la IA varíe los caminos que toman, se ve convincente y sorprendente?
fuente
Como primera idea, intente agregar un pequeño valor aleatorio al peso de cada nodo al encontrar rutas. De esta manera, cada agente buscará una ruta en un entorno ligeramente diferente. No estoy seguro de si esto funcionará en su caso, pero debería ser realmente fácil de intentar.
fuente
Sin embargo, me gusta la respuesta de Nevermind , dada la limitación descrita en los comentarios, esto es lo que intentaría:
(distanceToGoal) + Max(0, desiredDistance - distanceTravelled))
.Esto haría que las unidades intenten ir más allá, lo que probablemente sea un camino diferente, lo que podría resultar en que posiblemente tomen caminos diferentes.
También podría agregarlo a su huerestic inicial para cada unidad, pero el rango aleatorio probablemente tendría que ser un poco más grande.
fuente
Como señaló Nick Wiggill, el enfoque más simple sería obtener un círculo que rodeara el objetivo.
La parte importante es eliminar todos los caminos en el círculo para el waypoint original, ya que probablemente terminarías con enemigos cruzando el círculo para llegar a su waypoint inicial.
A partir de eso, puede obtener cualquier variante jugando con múltiples valores agregando puntos de referencia secundarios en el círculo cercano al inicial, etc.
fuente
Su problema aquí es esencialmente que A * es un algoritmo para encontrar la ruta más rápida a un objetivo. Si ese es su criterio principal para un 'buen' camino, entonces no es sorprendente que todos sus actores tomen las mismas decisiones.
Lo que debe hacer es modificar sus criterios de calidad para la ruta, de modo que 'el más corto es el mejor' no es el único factor. El elemento de aleatoriedad es clave en esto, pero no tanto como para restar valor a la inteligencia para encontrar el camino (es decir, los actores toman caminos estúpidamente indirectos hacia el objetivo).
A * pathfinding es ingenuo por naturaleza, ya que generalmente supone que el actor tiene un conocimiento perfecto de toda la ruta antes de que comience. Eso siempre se verá poco realista. La solución sugirió que los objetivos intermedios elegidos están a un paso de eso: la IA está tratando de acercarse al objetivo, pero solo trata de navegar en pequeñas secciones a la vez (esto es análogo a la vida real donde solo puedes navegar tan lejos como puede ver, y mientras atraviesa más del camino, puede ver más adelante).
Quizás recomendaría una forma más simple de verlo. Cuando esté buscando caminos, no solo mantenga un solo mejor camino que he encontrado hasta ahora. En su lugar, reúne un conjunto de las mejores 5 o 10 rutas. Use un umbral para descartar valores atípicos obvios. Por ejemplo, si el mejor camino atraviesa 20u para llegar al objetivo, el siguiente mejor atraviesa 21u, y el siguiente después de eso atraviesa 50u. Establezca un umbral de 20% más grande que la mejor ruta, y deseche la ruta de 50u porque es estúpidamente más larga. Ahora tiene varios caminos para elegir, y al seleccionar aleatoriamente de ese conjunto de caminos, sus actores tomarán diferentes decisiones.
Sin embargo, no obtendrá este tipo de información con la búsqueda estándar A *, por lo que creo que tendría que modificar el algoritmo o usar otra cosa para reunir el conjunto de posibles rutas.
fuente
Si tienes un pequeño conjunto de enemigos recurrentes (o tipos de enemigos), puedes tratar de darles personalidades que afecten sus movimientos. No tienen que ser grandes cosas, solo cosas que surgen de vez en cuando. Un buen ejemplo de esto son los fantasmas de Pac-Man. Divide tu A * en varios objetivos intermedios. Tal vez un enemigo es realmente estúpido y se pierde fácilmente, yendo en una dirección aleatoria cada tercer nodo (que no sea directamente hacia atrás). Ser creativo.
fuente