Noticias

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

Navmesh mas cercano a un obstaculo

Iniciado por ecko, Marzo 11, 2018, 05:15:36 PM

Tema anterior - Siguiente tema
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?

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


   
eature=oembed" width="480">

 
 
 
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

Marzo 11, 2018, 11:23:11 PM #2 Ultima modificación: Marzo 12, 2018, 10:37:05 AM por pioj
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:
 



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

[/quote]
 
El servidor recibe el vector vPosicion para mover el jugador con lo siguiente:
 



   
       
   
   
      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;
   
   
        }
   
   
      }
   
   
       
   

[/quote]
 
 
 
Pero no sé porque la función FindClosestEdge no funciona bien.




   
       
   

[/quote]
 
Resuelto, simplemente usando NavMesh.SamplePosition :)  

Etiquetas: