Entonces: juego de arriba hacia abajo, mis enemigos persiguen al jugador, cuando se acercan a una cierta distancia se quedan quietos y disparan. Si todos vienen de la misma dirección, todos terminan parados en el mismo lugar (es decir, parados "dentro" uno del otro), ya que actualmente no estoy haciendo detección de colisión entre enemigos: son libres de pasar el uno sobre el otro.
¿Qué es una forma simple de evitar esto? ¿Alguna forma de detección de colisión o alguna ai?
ai
collision-detection
Iain
fuente
fuente
Respuestas:
No necesita detección de colisión, pero tendrá que darles a sus enemigos un poco de inteligencia y evitar que se encuentren. La detección de colisión sin eso solo hará que tus enemigos se vean estúpidos de todos modos: las personas se evitan entre sí, generalmente no chocan.
Busque "congregación" para algunos comportamientos simples.
La idea básica es que las cosas deben dirigirse hacia el jugador, pero lejos de un obstáculo cercano (entre sí, paredes, ese tipo de cosas).
fuente
Podrías inspirarte en comportamientos de congregación , como Boids .
Estos tienden a consistir en 3-4 reglas muy simples que, aplicadas correctamente, resultan en comportamientos muy satisfactorios y de "aspecto complejo".
En su caso, podría intentar algo como esto:
fuente
Lo que estás preguntando en general es la evasión dinámica entre actores. Puede echar un vistazo a los obstáculos de velocidad: http://gamma.cs.unc.edu/RVO/
fuente
Es posible que desee consultar la difusión colaborativa (excelentes animaciones aquí) o algún otro tipo de patrón antiobjeto para el movimiento. Si bien el algoritmo de difusión en sí mismo puede no impedir que los enemigos se crucen, puede agregar restricciones adicionales para que sea poco probable o imposible.
fuente
¿Qué pasa si no permite moverse a través de otras unidades? Me parece que lo necesitará tarde o temprano. Siempre que el camino actual sea bloqueado por una unidad, ajuste el camino para moverse alrededor de eso.
fuente
En el sitio web de Craig Reynold hay referencias para los comportamientos de dirección y de congregación . Son relativamente simples de implementar, pero pueden producir un comportamiento emergente encantador.
fuente
Todas las otras respuestas producen un mejor resultado, pero la forma más económica (?) De evitar la agrupación completa es simplemente agregar un vector aleatorio que tal vez sea el 25% del vector de movimiento calculado original para que los objetos reboten un poco en un grupo de blobs generales . No mantendrá las cosas completamente separadas, pero dependiendo de lo que intente lograr, he descubierto que esto puede ser adecuado. Los objetos aún pueden agruparse con este método si corres círculos alrededor de ellos, pero con el tiempo tienden a difuminarse.
Aquí hay un pequeño juego que hice hace varios años que demuestra este método: http://deleter.phatcode.net/index.php?page=projects&p=4
fuente
La gente siempre saca los boids porque eso da muy buenos resultados, pero implementar boids puede ser excesivo para su propósito específico. En el pasado, obtuve muy buenos resultados simplemente aleatorizando la posición del objetivo dentro de un círculo pequeño.
Por ejemplo, para una demostración que construí en Unity utilicé su comando Random.insideUnitSphere para hacer puffballs en masa
fuente
Estaba enfrentando el mismo problema cuando uso NevMeshAgent como enemigo, los enemeis están penetrando entre sí, así que aumento el
Radio de NavMeshAgent
Gracias a gameDevAnswer
fuente