Jump to content
Sign in to follow this  
ecko

navmesh esquivar jugadores

Recommended Posts

7 hours ago, francoe1 said:

y como todo lo que te da UNITY es de MALO para ABAJO

 

7 hours ago, Eskema said:

Luego cuando lo dominas pasas del navmesh de unity y te pillas un plugin y vives mas feliz XD

 

... Haters gonna hate

Share this post


Link to post
Share on other sites

Respecto a la duda inicial del post, tienes que cambiar el Quality en el Obstacle Avoidance del NavMeshAgent, respecto a poner un objeto vacio con un NavMeshObstacle, no creo que funcione ya que cuando un NavMeshAgent esta demasiado cerca a un NavMeshObstacle (en este caso totalmente en el centro), el desireVelocity del NavMeshAgent te empieza a dar valores extraños lo cual te daña la navegación, lo que yo hago personalmente es cambiar el Quality a un valor diferente a None, y añado un NavMesAgent y un NavMeshObstacle en el mismo GameObject, pero ambos no pueden estar activos al mismo tiempo es decir, si tu AI se detiene por pequeños momentos, que seria lo mas normal, desactivas el NavMeshAgent y activas el NavMeshObstacle, luego cuando vayas a navegar, justo antes de navegar, activas el NavMeshAgent y desactivas el NavMeshObstacle, todo esto debería bastar para que se vea decente.

  • Like 1

Share this post


Link to post
Share on other sites
On 8/27/2018 at 6:53 PM, James Roman said:

Respecto a la duda inicial del post, tienes que cambiar el Quality en el Obstacle Avoidance del NavMeshAgent, respecto a poner un objeto vacio con un NavMeshObstacle, no creo que funcione ya que cuando un NavMeshAgent esta demasiado cerca a un NavMeshObstacle (en este caso totalmente en el centro), el desireVelocity del NavMeshAgent te empieza a dar valores extraños lo cual te daña la navegación, lo que yo hago personalmente es cambiar el Quality a un valor diferente a None, y añado un NavMesAgent y un NavMeshObstacle en el mismo GameObject, pero ambos no pueden estar activos al mismo tiempo es decir, si tu AI se detiene por pequeños momentos, que seria lo mas normal, desactivas el NavMeshAgent y activas el NavMeshObstacle, luego cuando vayas a navegar, justo antes de navegar, activas el NavMeshAgent y desactivas el NavMeshObstacle, todo esto debería bastar para que se vea decente.

Hice esto que comentas y funciona todo bien salvo un pequeño detalle, a la hora de desactivar el obstacle y activar el agente pega como un pequeño saltito y he comprobado que se debe a que a la hora de desactivar el obstacle no le da tiempo a quitar el agujero tallado y calcula la nueva ruta con este tallado.

La prueba que hice para averiguarlo fué desactivar obstacle y luego activar agent en diferentes pasos y de este modo funciona perfecto pero si lo hago todo en una misma iteración me da el problema del salto.

Share this post


Link to post
Share on other sites
52 minutes ago, ecko said:

Hice esto que comentas y funciona todo bien salvo un pequeño detalle, a la hora de desactivar el obstacle y activar el agente pega como un pequeño saltito y he comprobado que se debe a que a la hora de desactivar el obstacle no le da tiempo a quitar el agujero tallado y calcula la nueva ruta con este tallado.

La prueba que hice para averiguarlo fué desactivar obstacle y luego activar agent en diferentes pasos y de este modo funciona perfecto pero si lo hago todo en una misma iteración me da el problema del salto.

yo lo hago dentro de una coroutina, te comparte el código que uso para estos casos , ademas hago un montón de comprobaciones en caso de que el camino se genere erróneamente, espero te sirva :91_thumbsup:

PathGenerator.cs

  • Like 1

Share this post


Link to post
Share on other sites

Hola James, gracias por la aportación :), se me ocurrió lo mismo que acabas de decir de hacer una corrutina y parece que funciona perfectamente de este modo, el script que mandastes está vacío jjejee y bueno la corrutina que hice fué simplemente esto:

            GetComponent<NavMeshObstacle>().enabled = false;
            yield return new WaitForSeconds(.1f);
            GetComponent<NavMeshAgent>().enabled = true;  

no sé si hay alguna otra forma mas eficiente como hacer una especie de yield hasta que detecte que se ha desactivado por completo :S

Edited by ecko

Share this post


Link to post
Share on other sites
17 hours ago, James Roman said:

Pues tienes razón ha quedado vació el script, te lo dejo por aca https://pastebin.com/pBQz9din , respecto a yield con que esperes un frame es suficiente, es decir Time.deltaTime en lugar d .1f, saludos!

Solo para mencionarlo, si retornas "null" (del yield) tiene el efecto de esperar al siguiente frame, como el final de un Update :)

Share this post


Link to post
Share on other sites

Se me ocurre un script loco en el que cuando dos agentes chocan se decida (Al azar, o dando prioridad a un tipo o aun Id, o al que esté mas en una coordenada, que se yo) cual de ellos para, avanza en la direccion contraria a la que estaba x cantidad, espera, digamos un segundo (para que el otro siga moviéndose como debe) y luego arranca de nuevo.

Ahora ya escribir el código, aún se me escapa.
 

Saludos!

https://www.alucinoconfeisbuk.com/2017/10/pase-usted-primero_25.html

Edited by CastGames

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...