Como "medir" a distância do caminho no NavMesh??
2 participantes
Página 1 de 1
Como "medir" a distância do caminho no NavMesh??
Estou usando o navmesh, para mover o meu inimigo em um jogo 3D que se passa em um labirinto, esse labirinto tem portas que se movem e etc.
Eu preciso saber quando a distância que o navmesh vai percorrer, para poder chegar ao seu destino. Primeiro pra evitar que ele dê a volta no mapa inteiro, caso um dos waypoints que eu defini esteja com o caminho mais curto bloqueado pela porta. E segundo pra poder determinar qual dos inimigo eu vou mandar perseguir o player, com base no que está com caminho menor.
Eu tentei usar o remainingDistance, mas ele sempre retornar o valor 0.
Pensei em usar a contagem de
corners, mas não to conseguindo fazer isso, não sei como.
Eu preciso saber quando a distância que o navmesh vai percorrer, para poder chegar ao seu destino. Primeiro pra evitar que ele dê a volta no mapa inteiro, caso um dos waypoints que eu defini esteja com o caminho mais curto bloqueado pela porta. E segundo pra poder determinar qual dos inimigo eu vou mandar perseguir o player, com base no que está com caminho menor.
Eu tentei usar o remainingDistance, mas ele sempre retornar o valor 0.
Pensei em usar a contagem de
corners, mas não to conseguindo fazer isso, não sei como.
Laylson.f- Iniciante
- PONTOS : 1988
REPUTAÇÃO : 0
Respeito as regras :
Re: Como "medir" a distância do caminho no NavMesh??
É só percorrer cada ponto do caminho gerado, e somar as distâncias entre eles.
Eu fiz esse exemplo, pra funcionar direito, habilite os Gizmos na aba de Jogo.
Segue o link:
https://drive.google.com/open?id=1o6xf_zSnFl15clrXuCYdloBy-Otd9Jij
Quem quiser olhar apenas o código, a parte que lhe interessa está no método CalcularDistancia():
Apesar do NavMesh Agent ter uma velocidade constante definida no inspector, ele desacelera dependendo do quão fechada é a curva, por isso o tempo estimado flutua bastante, mas quando a trajetória é uma reta, o tempo deixa de flutuar.
Eu fiz esse exemplo, pra funcionar direito, habilite os Gizmos na aba de Jogo.
Segue o link:
https://drive.google.com/open?id=1o6xf_zSnFl15clrXuCYdloBy-Otd9Jij
Quem quiser olhar apenas o código, a parte que lhe interessa está no método CalcularDistancia():
- Codigo:
- Código:
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UI;
public class Bot : MonoBehaviour
{
public NavMeshAgent botNav;
public NavMeshPath caminho;
public Transform destinoT;
public Text distTxt, tempTxt;
public float distancia;
void Start()
{
botNav.destination = destinoT.position;
caminho = new NavMeshPath();
}
void Update()
{
EncontrarCaminho(destinoT, caminho);
ExibirCaminho();
distancia = CalcularDistancia();
AtualizarUI();
}
private float CalcularDistancia()
{
float dist = 0;
if (( caminho.status != NavMeshPathStatus.PathInvalid ))
{
for ( int i = 1; i < caminho.corners.Length; ++i )
{
dist += Vector3.Distance( caminho.corners[i-1], caminho.corners[i] );
}
}
return dist;
}
private void EncontrarCaminho(Transform destino, NavMeshPath caminho )
{
NavMesh.CalculatePath(transform.position, destinoT.position, NavMesh.AllAreas, caminho);
}
private void ExibirCaminho() //Ative a opção de Gizmos na tela do jogo.
{
for (int i = 0; i < caminho.corners.Length - 1; i++)
Debug.DrawLine(caminho.corners[i], caminho.corners[i + 1], Color.green);
}
private void AtualizarUI(){
distTxt.text = "Distância do destino: " + distancia.ToString("F1") + "m";
tempTxt.text = distancia > 0.1f ? "Tempo até a chegada: "+(distancia/botNav.velocity.magnitude).ToString("F2")+"s" : "Destino alcançado";
}
}
Apesar do NavMesh Agent ter uma velocidade constante definida no inspector, ele desacelera dependendo do quão fechada é a curva, por isso o tempo estimado flutua bastante, mas quando a trajetória é uma reta, o tempo deixa de flutuar.
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Como "medir" a distância do caminho no NavMesh??
Fagner escreveu:É só percorrer cada ponto do caminho gerado, e somar as distâncias entre eles.
Eu fiz esse exemplo, pra funcionar direito, habilite os Gizmos na aba de Jogo.
Segue o link:
https://drive.google.com/open?id=1o6xf_zSnFl15clrXuCYdloBy-Otd9Jij
Quem quiser olhar apenas o código, a parte que lhe interessa está no método CalcularDistancia():
- Codigo:
- Código:
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UI;
public class Bot : MonoBehaviour
{
public NavMeshAgent botNav;
public NavMeshPath caminho;
public Transform destinoT;
public Text distTxt, tempTxt;
public float distancia;
void Start()
{
botNav.destination = destinoT.position;
caminho = new NavMeshPath();
}
void Update()
{
EncontrarCaminho(destinoT, caminho);
ExibirCaminho();
distancia = CalcularDistancia();
AtualizarUI();
}
private float CalcularDistancia()
{
float dist = 0;
if (( caminho.status != NavMeshPathStatus.PathInvalid ))
{
for ( int i = 1; i < caminho.corners.Length; ++i )
{
dist += Vector3.Distance( caminho.corners[i-1], caminho.corners[i] );
}
}
return dist;
}
private void EncontrarCaminho(Transform destino, NavMeshPath caminho )
{
NavMesh.CalculatePath(transform.position, destinoT.position, NavMesh.AllAreas, caminho);
}
private void ExibirCaminho() //Ative a opção de Gizmos na tela do jogo.
{
for (int i = 0; i < caminho.corners.Length - 1; i++)
Debug.DrawLine(caminho.corners[i], caminho.corners[i + 1], Color.green);
}
private void AtualizarUI(){
distTxt.text = "Distância do destino: " + distancia.ToString("F1") + "m";
tempTxt.text = distancia > 0.1f ? "Tempo até a chegada: "+(distancia/botNav.velocity.magnitude).ToString("F2")+"s" : "Destino alcançado";
}
}
Apesar do NavMesh Agent ter uma velocidade constante definida no inspector, ele desacelera dependendo do quão fechada é a curva, por isso o tempo estimado flutua bastante, mas quando a trajetória é uma reta, o tempo deixa de flutuar.
Quando eu uso o caminho.corners.Length, ele sempre retorna 1
Laylson.f- Iniciante
- PONTOS : 1988
REPUTAÇÃO : 0
Respeito as regras :
Re: Como "medir" a distância do caminho no NavMesh??
Testou o projeto que mandei?
Poste seu código pra darmos uma olhada.
Poste seu código pra darmos uma olhada.
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Como "medir" a distância do caminho no NavMesh??
Fagner escreveu:Testou o projeto que mandei?
Poste seu código pra darmos uma olhada.
sim, testei o projeto inteiro, coloquei da mesma forma no meu e o resultado do Caminho.corners.Length continua como 0;
até testei no seu projeto, da forma que eu estava colocando no meu, só pra entender se iria funcionar, e sim, funcionou de boas.
o unico problema é esse, os corners.Length sempre vem como 0;
Laylson.f- Iniciante
- PONTOS : 1988
REPUTAÇÃO : 0
Respeito as regras :
Re: Como "medir" a distância do caminho no NavMesh??
deixa pra la... começou a funcionar DO NADA...Fagner escreveu:Testou o projeto que mandei?
Poste seu código pra darmos uma olhada.
Nessas horas a gente fica feliz e com raiva ao mesmo tempo.
mas ainda assim, sua solução ajudou bastante, e eu vou usar, obrigado.
Laylson.f- Iniciante
- PONTOS : 1988
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» Como fazer uma IA sem Navmesh
» [Ajuda] Como faço uma IA de Animal Com navmesh?
» Matrix-Terreno-Limites-Caminho
» Como mover um objeto para outro objeto (Navmesh ?)
» [TUTORIAL] Script para medir o FPS do seu JOGO
» [Ajuda] Como faço uma IA de Animal Com navmesh?
» Matrix-Terreno-Limites-Caminho
» Como mover um objeto para outro objeto (Navmesh ?)
» [TUTORIAL] Script para medir o FPS do seu JOGO
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos