Jump to content
Sign in to follow this  
ecko

Navmesh mas cercano a un obstaculo

Recommended Posts

Hola a tod@s, quisiera saber si es posible obtener el destino mas cercano transitable de un navmes, es decir, tengo un mapa con árboles y muros y a estos árboles y muros le he asociado el componente navmeshobstacle con la opción carve activada lo cual crea un hueco no transitable en la navegación del navmesh, hasta quí todo esta genial ya que cuando pulso con el ratón un click le asigno al navmeshagent.destination la nueva posicion de destino y si hay obstaculos por medio de su destino los evita rodeandolos y tal, pero el problema esta cuando hago click sobre un obstaculo (ej un árbol) mi jugador ni siquiera se mueve ya que internamente detecta que es una zona no valida de navegación pero claro yo quiero que mi agente navegue hasta la posición navegable más próxima de este obstaculo.

Hay alguna forma de saber la posición mas cercana al obstaculo para asignarle al navmeshagent.destination esa posición válida?

Share this post


Link to post
Share on other sites

Hola, basado en un vid que vi hace un tiempito:

 

fijate por el minuto 9:00... vos podés detectar mediante raycast la mesh base o la que está debajo del objeto obstáculo, (ej el cesped), y poner a este en otra capa (para no detectarlo en el raycast), entonces al final estarías detectando un punto espacial no valido, ponés el destination ahí y en teoría el agente se moverá hasta donde pueda.

Otra cosa, si tenés arboles o cualquier cosa estática no uses obstacle para todos los muros y árboles, directamente hacé un bake, si existe algun muro en especial o árbol en especial está bien.

Saludos

Share this post


Link to post
Share on other sites

Buenas, te agradezco la info, pero creo que no me sirve ese método ya que se basa en ignorar los objetos y así mandar el destino sobre la capa interior del terreno, pero yo como uso el componente obstaculo que lo pongo a los árboles sobretodo ya que al talarlos dejan de ser obstaculos y de lo contrario si deben serlo, entonces he estado mirando algo y hice algo así:

El cliente  hace lo siguiente:

Cita

var Posicion:Vector3=Vector3.zero;
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),hit, 100,this.movimientoMask)) {
   Posicion=hit.point;
}

El servidor recibe el vector vPosicion para mover el jugador con lo siguiente:

Cita

 

function Mover(Posicion : Vector3){

  var path: NavMeshPath = NavMeshPath();

  GetComponent(Jugador).agent.CalculatePath(Posicion, path);

  if ((path.status == NavMeshPathStatus.PathPartial) || (path.status == NavMeshPathStatus.PathInvalid)) { // Si la posicion dada esta en un area no valida la recalcula sobre el punto mas cercano
              var hit: NavMeshHit;
              if (NavMesh.FindClosestEdge(Posicion, hit, NavMesh.AllAreas)) {
                  GetComponent(Jugador).agent.destination=hit.position;
              }

  }
  else{
          GetComponent(Jugador).agent.destination=Posicion;

  }

}

 

 

Pero no sé porque la función FindClosestEdge no funciona bien.

Edited by pioj
Por favor, usa el <> o el "quote" para pegar código.

Share this post


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

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