DUVIDA SOBRE FAZER ROTAS COM POINTS!?
2 participantes
Página 1 de 1
DUVIDA SOBRE FAZER ROTAS COM POINTS!?
Bom dia, Boa Tarde ou Boa noite, estou com uma duvida que seria fazer um sistema de Points para poder calcular rota do player para chegar ao destino selecionado, tava estudando sobre o Navmesh que faz automaticamente a rota e caso o player erre a rota ja calcula outra mas tive conflito entre o NavMesh com FloatingOrigem e queria implementar isso caso o player erre a rota no sistema de points, fiz um exemplo bem simples no PhotoShop com seria mais ou menos que queria colocar em pratica!
Kayke_27- Iniciante
- PONTOS : 2416
REPUTAÇÃO : 1
Respeito as regras :
Re: DUVIDA SOBRE FAZER ROTAS COM POINTS!?
Pergunta complexa demais pra responder num tópico só, mas vou deixar uns pontos aqui que podem te ajudar a montar um sistema assim:
Waypoints, tem vários tutoriais até aqui no fórum, o interesse não é o sistema em si, mas a estrutura de dados usada, geralmente cada waypoint possui a referência do próximo ponto a seguir, no seu sistema, cada ponto precisa ter um array de pontos vizinhos que mais pra frente sera usado pra calcular as rotas.
Esse é um exemplo de como seria o script dos pontos, cada um tem uma referência dos vizinhos e também alguns gizmos pra facilitar a visualização das relações entre eles, isso não é o ideal, mas é um começo.
Note que as setinhas apontam apenas pros vizinhos, indicando um sentido pra rota, se ambos os pontos são vizinhos um do outro, a rota é de sentido duplo.
Um algoritmo que encontre a melhor rota, nesse caso recomendo o A*(A Star), é bem conhecido, tem bastante tutorial sobre ele na net e é o que a Unity utiliza internamente pra calcular as rotas usando Navmesh.
https://www.youtube.com/watch?v=s29WpBi2exw
https://www.youtube.com/watch?v=aYKSuRTFndo
Opcional: Um editor para ligar os pontos, editar conexões e atribuir informações extras aos pontos.
A menos que não se importe em gastar dias ligando pontos e editando informações extras que o algoritmo de calculo de rota precisa pra funcionar corretamente, é recomendado estudar um pouco sobre Editor Script para automatizar certas tarefas pra você.
Dica extra: como você já está preocupado com floating origin, quanto menos coisas você mover, melhor, nesse caso é uma boa utilizar os pontos (gameobjects) apenas no editor, e utilizar a posição deles no game. marque esses pontos com a tag "EditorOnly", que a Unity vai se encarregar de excluí-los quando você fizer a build, lembrando de antes armazenar as posições de cada ponto, para que no final você substitua os transforms por Vector3's, eliminando o custo extra que cada transform desse teria durante o floating origin.
Waypoints, tem vários tutoriais até aqui no fórum, o interesse não é o sistema em si, mas a estrutura de dados usada, geralmente cada waypoint possui a referência do próximo ponto a seguir, no seu sistema, cada ponto precisa ter um array de pontos vizinhos que mais pra frente sera usado pra calcular as rotas.
Esse é um exemplo de como seria o script dos pontos, cada um tem uma referência dos vizinhos e também alguns gizmos pra facilitar a visualização das relações entre eles, isso não é o ideal, mas é um começo.
Note que as setinhas apontam apenas pros vizinhos, indicando um sentido pra rota, se ambos os pontos são vizinhos um do outro, a rota é de sentido duplo.
- Código:
using UnityEngine;
public class Ponto : MonoBehaviour
{
public Ponto[] vizinhos;
private void OnDrawGizmos()
{
GerarMeshGizmo();
Gizmos.DrawSphere(transform.position, 0.4f);
if (vizinhos!=null)
{
for (int i = 0; i < vizinhos.Length; i++)
{
Gizmos.DrawLine(transform.position, vizinhos[i].transform.position);
Vector3 direcao = (vizinhos[i].transform.position - transform.position).normalized;
Gizmos.DrawWireMesh(mesh, transform.position, Quaternion.LookRotation(direcao, Vector3.up));
}
}
}
#region meshGizmo
Vector3[] gizmoVerts = new Vector3[3];
int[] gizmoTris = new int[3] { 0, 1, 2 };
Mesh mesh;
private void GerarMeshGizmo()
{
gizmoVerts = new Vector3[3];
gizmoVerts[0] = new Vector3(0, 0, 1);
gizmoVerts[1] = new Vector3(-0.2f, 0, 0.5f);
gizmoVerts[2] = new Vector3(0.2f, 0, 0.5f);
Vector3[] normais = new Vector3[3]
{
Vector3.up,
Vector3.up,
Vector3.up
};
mesh = new Mesh();
mesh.vertices = gizmoVerts;
mesh.triangles = gizmoTris;
mesh.normals = normais;
}
#endregion
}
Um algoritmo que encontre a melhor rota, nesse caso recomendo o A*(A Star), é bem conhecido, tem bastante tutorial sobre ele na net e é o que a Unity utiliza internamente pra calcular as rotas usando Navmesh.
https://www.youtube.com/watch?v=s29WpBi2exw
https://www.youtube.com/watch?v=aYKSuRTFndo
Opcional: Um editor para ligar os pontos, editar conexões e atribuir informações extras aos pontos.
A menos que não se importe em gastar dias ligando pontos e editando informações extras que o algoritmo de calculo de rota precisa pra funcionar corretamente, é recomendado estudar um pouco sobre Editor Script para automatizar certas tarefas pra você.
Dica extra: como você já está preocupado com floating origin, quanto menos coisas você mover, melhor, nesse caso é uma boa utilizar os pontos (gameobjects) apenas no editor, e utilizar a posição deles no game. marque esses pontos com a tag "EditorOnly", que a Unity vai se encarregar de excluí-los quando você fizer a build, lembrando de antes armazenar as posições de cada ponto, para que no final você substitua os transforms por Vector3's, eliminando o custo extra que cada transform desse teria durante o floating origin.
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: DUVIDA SOBRE FAZER ROTAS COM POINTS!?
Exatamente sobre isso que estava estudando no momento, obrigado pela ajuda!!! Ajudou dmsFagner escreveu:Pergunta complexa demais pra responder num tópico só, mas vou deixar uns pontos aqui que podem te ajudar a montar um sistema assim:
Waypoints, tem vários tutoriais até aqui no fórum, o interesse não é o sistema em si, mas a estrutura de dados usada, geralmente cada waypoint possui a referência do próximo ponto a seguir, no seu sistema, cada ponto precisa ter um array de pontos vizinhos que mais pra frente sera usado pra calcular as rotas.
Esse é um exemplo de como seria o script dos pontos, cada um tem uma referência dos vizinhos e também alguns gizmos pra facilitar a visualização das relações entre eles, isso não é o ideal, mas é um começo.
Note que as setinhas apontam apenas pros vizinhos, indicando um sentido pra rota, se ambos os pontos são vizinhos um do outro, a rota é de sentido duplo.
- Código:
using UnityEngine;
public class Ponto : MonoBehaviour
{
public Ponto[] vizinhos;
private void OnDrawGizmos()
{
GerarMeshGizmo();
Gizmos.DrawSphere(transform.position, 0.4f);
if (vizinhos!=null)
{
for (int i = 0; i < vizinhos.Length; i++)
{
Gizmos.DrawLine(transform.position, vizinhos[i].transform.position);
Vector3 direcao = (vizinhos[i].transform.position - transform.position).normalized;
Gizmos.DrawWireMesh(mesh, transform.position, Quaternion.LookRotation(direcao, Vector3.up));
}
}
}
#region meshGizmo
Vector3[] gizmoVerts = new Vector3[3];
int[] gizmoTris = new int[3] { 0, 1, 2 };
Mesh mesh;
private void GerarMeshGizmo()
{
gizmoVerts = new Vector3[3];
gizmoVerts[0] = new Vector3(0, 0, 1);
gizmoVerts[1] = new Vector3(-0.2f, 0, 0.5f);
gizmoVerts[2] = new Vector3(0.2f, 0, 0.5f);
Vector3[] normais = new Vector3[3]
{
Vector3.up,
Vector3.up,
Vector3.up
};
mesh = new Mesh();
mesh.vertices = gizmoVerts;
mesh.triangles = gizmoTris;
mesh.normals = normais;
}
#endregion
}
Um algoritmo que encontre a melhor rota, nesse caso recomendo o A*(A Star), é bem conhecido, tem bastante tutorial sobre ele na net e é o que a Unity utiliza internamente pra calcular as rotas usando Navmesh.
https://www.youtube.com/watch?v=s29WpBi2exw
https://www.youtube.com/watch?v=aYKSuRTFndo
Opcional: Um editor para ligar os pontos, editar conexões e atribuir informações extras aos pontos.
A menos que não se importe em gastar dias ligando pontos e editando informações extras que o algoritmo de calculo de rota precisa pra funcionar corretamente, é recomendado estudar um pouco sobre Editor Script para automatizar certas tarefas pra você.
Dica extra: como você já está preocupado com floating origin, quanto menos coisas você mover, melhor, nesse caso é uma boa utilizar os pontos (gameobjects) apenas no editor, e utilizar a posição deles no game. marque esses pontos com a tag "EditorOnly", que a Unity vai se encarregar de excluí-los quando você fizer a build, lembrando de antes armazenar as posições de cada ponto, para que no final você substitua os transforms por Vector3's, eliminando o custo extra que cada transform desse teria durante o floating origin.
Kayke_27- Iniciante
- PONTOS : 2416
REPUTAÇÃO : 1
Respeito as regras :
Tópicos semelhantes
» Duvida sobre UVs
» Dúvida sobre Prefab's e Sistema de fazer o próprio personagem
» Dúvida sobre portas
» [Dúvida] - Pequena dúvida sobre o IENumerator..
» [DÚVIDA] Dúvida sobre script e rigidbody
» Dúvida sobre Prefab's e Sistema de fazer o próprio personagem
» Dúvida sobre portas
» [Dúvida] - Pequena dúvida sobre o IENumerator..
» [DÚVIDA] Dúvida sobre script e rigidbody
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos