Noticias

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

Mis Nav Mesh agents se atascan por el camino y por los Off Mesh Links.

Iniciado por Antonio, Agosto 26, 2015, 11:01:15 PM

Tema anterior - Siguiente tema
Agosto 26, 2015, 11:01:15 PM Ultima modificación: Agosto 26, 2015, 11:23:59 PM por Antonio
Buenas noches. 

Con el Unity 5, todo lo que tenía hecho en RAIN se me fue al traste, T_T pero bueno, no pasa nada, he estado re-haciendo la IA de los enemigos con el nav mesh de Unity 5, la mayoría de las funciones ya están implementadas, y estoy intentando pues resolver problemas, pero este no consigo dar con la tecla. @_@

Resulta que los enemigos, cuando van persiguiendo al jugador, se atascan en algunos puntos, del escenario, parece que principalmente en los bordes, que no caen. El escenario, tiene su Navmesh preparado con una serie de Off-Mesh links generados automáticamente para que un enemigo salte a una zona inferior para seguir con la ***cución o el paseo. Suele funcionar, pero en este ejemplo, con 10 enemigos en tropa siguiéndome, no todos pasan la prueba, con frecuencia, algunos se van quedando por el camino. 



He revisado el código, pero tampoco no veo el error, vemos, el enemigo tiene una serie de estados, y algunos de ellos ordena al enemigo que se mueva, eso lo hace llamando a esta función:
 pic 1: https://yadi.sk/i/8vJfVHmKigUXZ">https://yadi.sk/i/8vJfVHmKigUXZ
pic 2: https://yadi.sk/i/wrIBwQEkigUYC">https://yadi.sk/i/wrIBwQEkigUYC
pic 3: https://yadi.sk/i/6MPpI_dIigUYa">https://yadi.sk/i/6MPpI_dIigUYa 
   void MoveTo(Vector3 destination, bool aim, Vector3 lookPos)
{
   agent.transform.position = transform.position; //Le dice al NavMeshAgent cual es su posición actual.
       agent.destination = destination; //Le dice cual es el destino, (que es una posición que entra en la función).

   Vector3 velocity = agent.desiredVelocity * 0.5f; //con el destino, el NavMeshAgent crea una velocidad y dirección, desiredVelocity.
                                                           //la reduzco un poco que sale muy larga.
   charMove.Move (velocity,aim,lookPos);
 //Y la mando a mi character controller que es quien mueve el personaje.
}
Del character controller no tengo dudas, exactamente ese mismo código es el que uso para mover a mi personaje, con la diferencia de que en el personaje, es el script de "inputs" quien decide la dirección (en base a las teclas que esté pulsando y la posición de la cámara), como esto es un enemigo que se mueve sólo, esa dirección en teoría la coge del NavMeshAgent.

El character controller es básicamente el 3rd player controller del estandar de Unity, sólo que con modificaciones por doquier @_@, pero dudo que esté el error por ahí, el personaje sube y baja perfectamente, Poniendo un print (gameObject + "  " + velocity); puedo ver la velocidad que el navMesh agent le da a esos enemigos atascados, y parece acertada. (no es 0, es 0,5 en una dirección, otro con un 1.5f en otra, lo que explica que esté corriendo contra el borde), pero el caso es que de ahí, no se mueven.

Si en vez de NavMesh, le digo al enemigo que siga al jugador a lo básico (Vector3 velocity = EnemyToAttack.transform.postion - transform.position; ) todos van como posesos a por el jugador en línea recta, escalando y cayéndose como es debido, de modo que la cosa tiene que ser algo del Nav Mesh. @_@

He probado aumentar la velocidad angular, reducir el radio, aumentar el radio, también he probado en el Nav Mesh de la zona, modificar el radio de ahí, para que genere más o menos Off-Mesh links (esos nodos que salen en el borde para indicar al enemigo que puede contar esa bajada para hacer su camino). pero en fin, se mis pequeños se quedan perdidos por ahí.  

¿Alguien sabe cómo solucionar esto? algunos atascos en algunos pequeños escalones, es algo fácil de evitar, pero teniendo al enemigo que no puede bajar ningún desnivel, pues es un handicap. :S 
 

Prueba a asignar un PhysicMaterial con friccion 0 al collider. Suele haber problemas con la friccion al mover actores.

Agosto 28, 2015, 01:20:53 PM #2 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
El asunto de la fricción lo había probado pero tampoco funcionó, tengo un par de materiales, uno que aplicaba la fricción al máximo y otro que la ponía al mínimo, pensé eso, que se atascarían en los bordes por el rozamiento, pero poniéndoles el material de fricción mínima, igual se atascaban.

Al final apliqué el método de la almohada, hoy me dió por ignorar las advertencias y consejos de no tocar el "Voxel Size" y tal vez me equivoque, pero percibo que los atascos son menos frecuentes, (como que todavía no he conseguido que se vuelvan a atascar en los bordes) Algunos se pierden en algunas esquinas, o se quedan estancados subiendo una escalera  hacia arriba, pero eso ya son más cosas del terreno, (para escalar hacia arriba, suelen necesitan entrar en un trigger que hice que hace que escalen, el navigator los lleva hacia ese punto pero a veces giran antes de tiempo y no terminan de entrar en el trigger, eso son cosas menores que se pueden arreglar trabajando un poco la situación de cada escenario). 

Según el consejo, Sin tocar el Voxel Size, este sale con 0.1, que dice que son 3 vóxels por cada radio de un agente, es decir, como mis enemigos tienen de radio 0.3f, pues 0.3/3 = 0.1 que es el tamaño del voxel standard. Este lo puedo bajar hasta 0.038 porque 0.3/8 = 0.375 y el manual de Unity recomienda no poner más de 8 vóxels por radio de agente, porque en teoría los tiempos de carga se pueden hacer bastante costosos. Pero bueno, poniéndolo a 0.38, pues bajan los Off-Mesh links sin problemas, y poniéndolos a 0.5 (6 voxel por radio) parece que también van decentes...

Mi conclusión actual es que, el mapa, dado que tiene caídas verticales que requieren de los Off Mesh links  (los nodos que hacen que se tiren por los escalones), es necesario aumentar un poco el tamaño de los voxels para que puedan cruzar estos off mesh links sin problemas. Por lo que si mi escenario es plano, o un terrain suave, el voxel estándar parece ir bien, pero si tiene off meshlinks, entonces hay que aumentar los voxels.

Aun seguiré haciendo pruebas, pero creo que está funcionando... O.ò

Utilizando el componente NavMeshAgent para mover 60 actores, no he tenido ningún problema, sin modificar ningún parámetro para realizar el bake.Otra cosa, es que la funcion Move del CharacterController no aplica gravedad y quizás el desplazamiento en el eje Y sea insuficiente para hacer caer al personaje.

Agosto 29, 2015, 09:53:19 AM #4 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
No son characterMove, son Rigidbodies con su capsule collider, al principio también tenía dudas si podían ser las físicas, pero en una de las pruebas, si en vez de coger la dirección del nav mesh, cogía una que fuese simplemente tras el jugador, todos en tropa bajaban y subían cornisas sin ningún problema, por lo que nuevamente sospeché del navigator, además, el controller lo tengo bastante rayado porque es el mismo que uso para el jugador, que no se me ha atascado (todavía...).

Me alegro que lo pudirras arreglar. Solo un comentario un poco offtopi, has dicho que el RAIN se te fue al traste con la 5. Se fastidió al convertir a la 5 o no soporta la 5?

Agosto 29, 2015, 11:28:36 AM #6 Ultima modificación: Agosto 29, 2015, 11:29:53 AM por kaito
[quote author=Adngel" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="18843" data-ipsquote-contentcommentid="105646 date=1440834799]No son characterMove, son Rigidbodies con su capsule collider, [/quote] En el código te has referido con el mismo nombre que el componente CharacterController, eso me ha despistado un poco. Pero bueno, yo he utilizado una capsula collider sin Rigidbody ni CharacterController(componente), tan solo lo muevo con el NavMeshAgent. No tiene mucho sentido utilizar el Rigidbody para mover los enemigos, en lugar de utilizar directamente NavMeshAgent. Tus motivos tendrás, pero en todo caso yo despreciaría el valor del eje Y y dejaría al Rigidbody que aplicara la gravedad automáticamente. Si se sigue atascando, incluso añadiría un empuje positivo +Y al Rigidbody, siempre no superior al empuje de la gravedad.

Etiquetas: