[RESOLVIDO] NavMeshAgent parar
3 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] NavMeshAgent parar
Olá bom dia, estou com um problema no NavMeshAgent quando existe um gameObject no meio do caminho entre ele e o RaycastHit. O estilo de Movimentação é Move to Mouse Point. Quando ele chega perto do objeto que impede ele de passar ele fica fazendo um "MoonWalk", pois não consegue terminar a ação. Eu gostaria de saber qual a melhor maneira de parar ele. Já tentei OnCollisionEnter e busquei por Tag, mas parece que ele não colide com o objeto que o esta impedindo. Se alguem puder me ajudar.
Esse é o Script {
public class PlayerController : MonoBehaviour
{
public LayerMask whatCanBeClikedOn;
private Animator anim;
private NavMeshAgent myAgent;
private RaycastHit hitInfo;
private Rigidbody player;
// Start is called before the first frame update
void Start()
{
myAgent = GetComponent<NavMeshAgent>();
anim = GetComponent<Animator>();
player = GetComponent<Rigidbody>();
}
// Update is called once per frame
public void Update()
{
OnMouseButton();
}
public void OnMouseButton()
{
if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0))
{
Ray myRay = Camera.main.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(myRay, out hitInfo, 50, whatCanBeClikedOn);
myAgent.SetDestination(hitInfo.point);
anim.SetInteger("Transition", 1);
}
if (Vector3.Distance(transform.position, hitInfo.point) <= 0.01f)
{
anim.SetInteger("Transition", 0);
}
}
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "NotWalkable")
{
anim.SetInteger("Transition", 0);
Debug.Log("Estou colidindo aqui ó");
}
}
Esse é o Script {
public class PlayerController : MonoBehaviour
{
public LayerMask whatCanBeClikedOn;
private Animator anim;
private NavMeshAgent myAgent;
private RaycastHit hitInfo;
private Rigidbody player;
// Start is called before the first frame update
void Start()
{
myAgent = GetComponent<NavMeshAgent>();
anim = GetComponent<Animator>();
player = GetComponent<Rigidbody>();
}
// Update is called once per frame
public void Update()
{
OnMouseButton();
}
public void OnMouseButton()
{
if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0))
{
Ray myRay = Camera.main.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(myRay, out hitInfo, 50, whatCanBeClikedOn);
myAgent.SetDestination(hitInfo.point);
anim.SetInteger("Transition", 1);
}
if (Vector3.Distance(transform.position, hitInfo.point) <= 0.01f)
{
anim.SetInteger("Transition", 0);
}
}
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "NotWalkable")
{
anim.SetInteger("Transition", 0);
Debug.Log("Estou colidindo aqui ó");
}
}
DVargas- Iniciante
- PONTOS : 1428
REPUTAÇÃO : 2
Idade : 29
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
Você só faz a transição se a distância for menor que 0.01f, mas o stop distance do navmesh agent é maior, logo, ele vai parar de se mover antes, dando a sensação que bateu em algo, e nunca vai chegar nessa distância de 1cm.
Aumente a distância da checagem ou diminua o stopping distance no navmesh agent.
Aumente a distância da checagem ou diminua o stopping distance no navmesh agent.
Fagner- Moderador
- PONTOS : 4442
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
Essa transição é em relação ao Raycast. Debuguei e oque esta acontecendo é que o NavMeshAgent não chega a colidir com o MeshCollider do Objeto em questão. Então o OnColissionEnter não é chamado. Acredito que a solução seja detectar mudanças bruscas na velocidade do Player e então encerrar o SetDestination. Mas não conheço nenhum metodo que me ajude nisso. Alguma dica para eu estudar?
DVargas- Iniciante
- PONTOS : 1428
REPUTAÇÃO : 2
Idade : 29
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
Alguma solução para. SE a velocidade sofrer alteração brusca ou o player for impedido então, faça {Ação especifica}.
DVargas- Iniciante
- PONTOS : 1428
REPUTAÇÃO : 2
Idade : 29
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
DVargas escreveu:Essa transição é em relação ao Raycast. Debuguei e oque esta acontecendo é que o NavMeshAgent não chega a colidir com o MeshCollider do Objeto em questão. Então o OnColissionEnter não é chamado. Acredito que a solução seja detectar mudanças bruscas na velocidade do Player e então encerrar o SetDestination. Mas não conheço nenhum metodo que me ajude nisso. Alguma dica para eu estudar?
DVargas- Iniciante
- PONTOS : 1428
REPUTAÇÃO : 2
Idade : 29
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
Graças ao vídeo a dúvida ficou mais clara.
Acredito que usando o SamplePosition você consiga fazer o que quer.
https://docs.unity3d.com/ScriptReference/AI.NavMesh.SamplePosition.html
Quando você pega a posição do hit, faça uma checagem com o samplePosition pra pegar o ponto na Navmesh mais próximo de onde clicou. Então, se você clica numa área válida, o boneco anda normal, se clica num local não navegável, ele acha o ponto mais perto e anda somente até lá, parando a animação quando encostar na cerca.
Lembrando que, o setDestination vai receber essa posição checada e não o hit.point diretamente.
Acredito que usando o SamplePosition você consiga fazer o que quer.
https://docs.unity3d.com/ScriptReference/AI.NavMesh.SamplePosition.html
Quando você pega a posição do hit, faça uma checagem com o samplePosition pra pegar o ponto na Navmesh mais próximo de onde clicou. Então, se você clica numa área válida, o boneco anda normal, se clica num local não navegável, ele acha o ponto mais perto e anda somente até lá, parando a animação quando encostar na cerca.
Lembrando que, o setDestination vai receber essa posição checada e não o hit.point diretamente.
Fagner- Moderador
- PONTOS : 4442
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
Boa tarde DVargas pode não ser o caso tambem mas tentou ir em navigation e na aba objects la vc seleciona todos os objetos que o player vai colidir e coloca todos em not walkable ai volta em bake e põe o agent radius em 1 e max slope em 35
isso aumentaria a distancia da colisão com objeto..
tenho um projeto de teste parado aqui usei esse codigo funcionou bem porem não fiz a parte de animação ainda, se te der alguma ideia ja ajuda.
no layermask e so adicionar uma layer Ground ou piso...
esse movSpeed so coloquei pra calcular a velocidade do navMesh e futuramente poder fazer uma condição para desativar bruscamente as animações ^^
pf aos que manjam mesmo toda critica é mais que bem vinda sei q o codigo ta zuado mas se for ajudar nem que seja como base de ideia ja fico feliz ^^
isso aumentaria a distancia da colisão com objeto..
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Player : MonoBehaviour {
public LayerMask podeAndarAqui; //Plane, piso ou local onde o player pode andar
public float movSpeed; //Somente para guardar a velocidade atual
private NavMeshAgent nav; //navmeshagent
void Start () {
nav = GetComponent<NavMeshAgent> ();
}
void Update () {
movSpeed = nav.velocity.magnitude; //Caso precise criar uma condição para desativar a animação
if (Input.GetMouseButtonDown (0)) {
Ray meuRaio = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast (meuRaio, out hitInfo, 100, podeAndarAqui)) {
nav.SetDestination (hitInfo.point);
}
}
}
}
tenho um projeto de teste parado aqui usei esse codigo funcionou bem porem não fiz a parte de animação ainda, se te der alguma ideia ja ajuda.
no layermask e so adicionar uma layer Ground ou piso...
esse movSpeed so coloquei pra calcular a velocidade do navMesh e futuramente poder fazer uma condição para desativar bruscamente as animações ^^
pf aos que manjam mesmo toda critica é mais que bem vinda sei q o codigo ta zuado mas se for ajudar nem que seja como base de ideia ja fico feliz ^^
speedluk- Avançado
- PONTOS : 2676
REPUTAÇÃO : 29
Idade : 32
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
Existe algum lugar onde eu possa ver exemplos de codigos nessa situação? Até agora apenas achei sobre navegação randomica de NPCs inclusive um no proprio forum da Unity reclamando de Bug. Eu entendi a logica, mas não sei como aplicar. Os elementos estão confusos aindaFagner escreveu:Graças ao vídeo a dúvida ficou mais clara.
Acredito que usando o SamplePosition você consiga fazer o que quer.
https://docs.unity3d.com/ScriptReference/AI.NavMesh.SamplePosition.html
Quando você pega a posição do hit, faça uma checagem com o samplePosition pra pegar o ponto na Navmesh mais próximo de onde clicou. Então, se você clica numa área válida, o boneco anda normal, se clica num local não navegável, ele acha o ponto mais perto e anda somente até lá, parando a animação quando encostar na cerca.
Lembrando que, o setDestination vai receber essa posição checada e não o hit.point diretamente.
DVargas- Iniciante
- PONTOS : 1428
REPUTAÇÃO : 2
Idade : 29
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
Segue um exemplo:
A posição do hit é checada usando o Sample Position, caso seja válida retorno ela mesma, se não for válida, retorno o ponto mais próximo na navmesh.
Só depois de checada, passo a posição final pro navmesh agent.
A esfera verde recebe a posição do click do mouse.
A esfera azul recebe o destino da navmesh depois que é feita a validação da posição.
Aqui está o link do projeto de exemplo:
https://drive.google.com/file/d/1tF-Y8eBn1awYCdyrzO33Khha2VnpXy3D/view?usp=sharing
A posição do hit é checada usando o Sample Position, caso seja válida retorno ela mesma, se não for válida, retorno o ponto mais próximo na navmesh.
Só depois de checada, passo a posição final pro navmesh agent.
A esfera verde recebe a posição do click do mouse.
A esfera azul recebe o destino da navmesh depois que é feita a validação da posição.
Aqui está o link do projeto de exemplo:
https://drive.google.com/file/d/1tF-Y8eBn1awYCdyrzO33Khha2VnpXy3D/view?usp=sharing
Fagner- Moderador
- PONTOS : 4442
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] NavMeshAgent parar
Quero Agradecer vocês de coração cara! Praticamente me deu mastigado. Muito obrigado, vou ser grato a você pra sempre. Tmj. resolvido.Deu certo já!Fagner escreveu:Segue um exemplo:
A posição do hit é checada usando o Sample Position, caso seja válida retorno ela mesma, se não for válida, retorno o ponto mais próximo na navmesh.
Só depois de checada, passo a posição final pro navmesh agent.
A esfera verde recebe a posição do click do mouse.
A esfera azul recebe o destino da navmesh depois que é feita a validação da posição.
Aqui está o link do projeto de exemplo:
https://drive.google.com/file/d/1tF-Y8eBn1awYCdyrzO33Khha2VnpXy3D/view?usp=sharing
DVargas- Iniciante
- PONTOS : 1428
REPUTAÇÃO : 2
Idade : 29
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Bug com NavMeshAgent
» [RESOLVIDO] NavMeshAgent
» [RESOLVIDO] Como desativar navmeshagent via script?
» [RESOLVIDO]Alguém tem alguma dica sobre NavMeshAgent
» [RESOLVIDO] Como Impulsionar Um Objeto Para Frente( X ) Sem Ele Parar (script para bala)
» [RESOLVIDO] NavMeshAgent
» [RESOLVIDO] Como desativar navmeshagent via script?
» [RESOLVIDO]Alguém tem alguma dica sobre NavMeshAgent
» [RESOLVIDO] Como Impulsionar Um Objeto Para Frente( X ) Sem Ele Parar (script para bala)
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos