Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

¿Combinando NavMesh y algoritmos de ***cución y combate?

Iniciado por Braltor, Mayo 11, 2016, 04:19:57 AM

Tema anterior - Siguiente tema
Mayo 11, 2016, 04:19:57 AM Ultima modificación: Mayo 11, 2016, 05:21:41 AM por Braltor
Nunca he usado NavMesh y estoy mirando si me ahorraría algo de trabajo, o si mejor hago mi propio sistema de navegación. ¿Cuál es la mejor forma de combinarlo con algortimos de ataque a corto y largo alcance? Talvez alguien tiene experiencia con esto.Por ejemplo, si uso el NavMesh para un perro, quiero que el perro recorra todo el mapa buscando una presa, y que cuando la vea corra y se acerque tan rápido como pueda para comenzar a morder. En muchos juegos, incluso los AAA, los personajes de este tipo muchas veces se van de narices contra los muros en cuanto ven al jugador, como tratando de atravesarlos en ves de dar la vuelta y pasar por la puerta primero... uno toma ventaja de estos defectos moviéndose de lado a lado hasta acercarse a una esquina para darle sus macanasos. Quiero un control más inteligente, ¿qué me recomiendan hacer?En otros casos más graves el enemigo puede lanzarse a un agujero tratando de alcanzar al jugador. Pero por ejemplo, uno quisiera que un guardia enemigo patrulle los caminos pero nunca pase por los arroyos porque se le mojan las botas... pero si ve al jugador poco le importará mojarse, aunque no será tan bruto para lanzarse por la cascada!!! ¿Qué me recomiendan para tener diferentes NavMesh?Otro caso: digamos que es un soldado enemigo con dos armas: un rifle y un mortero (ese tubo que ponen inclinado y lanza una granada parabólicamente), cómo manejarían la decisión entre lanzar una granada al otro lado de un muro, que talvez no pase según la altura del muro, o colocarse en mejor posición para darle unos balazos.Hay más casos como alejamientos para recargar o buscar munición, puntos para cubrirse, ***das, monstruos que caminan en el techo, etc. Pero con algunos consejos para los anteriores podrían darme las ideas que necesito... o si de plano el NavMesh no es lo que busco.

Yo utilizo NavMesh pero solo para obtener el path, así lo trabajo mejor por cada punto obtenido.
Si utilizas un sistema de patrulla seguramente utilizarías wayPoints y al detectar a una unidad enemiga, cancelaría este "patrullaje" y ***guiría a tal.
Ademas existen costes para diferentes partes de un terreno, por ejemplo el arrollo tendría un coste mas alto por lo cual el NavMesh lo tendrá en cuenta al general el path (y puedes desactivarlo, creo).
También se puede configurar la altura que puede saltar un personaje (para realizar un salto, etc).
Ya todo es tema de AI, lo que deberías pensarlo muy bien, por ejemplo lo que tu preguntas si lanzas un mortero o utilizas el rifle? eso no seria acorde a la distancia? O si es una granada, comprobar si hay un obstáculo hacia el enemigo, y realizar dichos cálculos para lanzarla.
Igualmente puedes crear varios puntos de entorno que te den estados para el enemigo.
Aquí mi simple ayuda, suerte!
 

Mayo 18, 2016, 01:13:18 PM #2 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
La granada creo que podría lanzarla si ve que el jugador está a cubierto, o si el jugador está cerca de varios aliados. Sobre donde lanzarla, pues imagino que a la última posición del jugador conocida.


Lo que yo hago es, que el enemigo al ver al jugador, actualiza la posición conocida, en el momento en que deja de ver al jugador (este se pierde detrás de una esquina o algo) la posición conocida deja de actualizarse, así que el enemigo lo que sabe es que ese fue el último punto donde le vio. Si tienes coberturas, puedes hacer que cuando el enemigo vea al jugador en dicho estado, actualice también algún flag que le diga que el jugador está cubierto, y en tal caso, pues proceder a buscar también otra cobertura o decidir si lanzar granadas.


La granada la lanzaría a la dirección de la última posición conocida, pero con algún pequeño desvío arbitrario (a menos que sea un robot de algoritmos exactos).  Así que si un jugador se pone a cubierto en una esquina y después se mueve permaneciendo oculto a la vista del enemigo, este seguirá lanzando la granada porque pensará que todavía está en esa esquina, no le atacará por otro lado de modo omnisciente. 
 
 
 
 
 
Lo del perro que cuando se acerca, es queda atascado en las esquinas, depende de más cosas no solo del nav mesh o el método de pathfinder que utilices. Si tus enemigos se atascan mucho por el nav mesh, este tenía la opción de aumentar su número de nodos, lo que afecta al rendimiento (cada enemigo tiene que hacer más cálculos para hallar su trayectoria) pero a su vez, también le permite hallar más caminos por escenarios complejos. No obstante, llegará un momento en que el enemigo tendrá que atacar, y proceder con la animación de ataque, ¿Qué clase de animación será?, un enemigo que dispara, es fácil, se para en su sitio apunta y Bang bang bang, tiene menos riesgos de quedarse atascado, pero un enemigo que tiene que hacer un ataque físico como el perro, llegará un momento en que tendrá que hacer la animación de correr hacia el jugador y atacarle (ya sea atravesándole o rebotando). En mi caso, ese tramo no se gestiona por los path finder, así que hay poco que mejorar ahí. :( Para evitar problemas, pues cuido las colisiones, hago un raycast antes de atacar para asegurarme de que lo está viendo (no con un muro o puerta de por medio) y procuro que el enemigo tenga una "salida" en su árbol de animaciones para que no se quede atascado en un estado.  Pero aún así hay que andar con ojo y hacer pruebas en distintos entornos para poder dar el visto bueno a un enemigo. O.ò
 
 
 
Sin ir más lejos, el último enemigo que estuve programando, era un jefe y quería que tuviera unos ataques especiales, donde se aleja del jugador un poco, y después vuelve contra él en forma de embestida, este funcionaba bien en campo abierto, pero cuando lo llevé a un pasillo más estrecho, noté que se que daba atascado dando la marcha atrás contra un muro, y sólo se recuperaba cuando el jugador se alejase (para iniciar la embestida), esas cosas no son de path finders si no fallos que hice al escribir el código en sí. :( 

Etiquetas: