Click para mover o player

Boa noite pessoal.
Estou tentando fazer script para mover um jogador pelo labirito não pra ele seguir sozinho, mas para se deslocar a cada clique do mouse ou touch do celular.
Conseguem me ajudar. Não é aqueles clicks que o player vai até o click desviando de obstáculos não. Somente ir até o click mesmo, clicando e indo

Como é um labirinto, eu acho que que é uma boa opção usar um navMesh, pra evitar do jogador apertar pra um lado do labirinto e o player ir pro destino e tentar atravessar as paredes. Da pra usar o método SetDestination do navMesh e um raycast pro player ir pra posição de destino.

Não estou conseguindo. quando clico o player fica deslizando e vai muito longe. Como é um labirinto e parede de todo lado é complicando. Os cliques tem que se perto do jogador e não estou conseguindo. Labirinto 3d

Me manda uma foto do labirinto. Acho que agora eu entendi, você quer que o player faça caminhos curtos?

Como estou no serviço agora vou mandar a imagem que usei e so coloquei cubos encima para fazer as paredes depois tirei a imagem
images

Então preciso que o player va indo a cada clique dentro do labirinto. Clico pra frente e ele vai ate onde cliquei. Clico para o lado e ele vai para o lado. Sempre esperando eu clicar

Isso en vendo como se estivesse dentro do labirinto ou com a camera um pouco acima mostrando parte do caminho não mostrando ate a saida

[SerializeField] private NavMeshAgent player;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{

}

// Update is called once per frame
void Update()
{
    if(Input.GetKeyDown(KeyCode.Mouse0))
    {
         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;

        

                
      if (Physics.Raycast(ray, out hit))
      {
         if (hit.collider.CompareTag("Parede"))return;
         player.SetDestination(hit.point);
      }
       
    }
    
}

Adiciona um NavMeshSurface no chão do labirinto e dar bake

Só se certifica de desativar o player da cena, pra evitar essas deformações na malha

Agora adiciona um NavMeshAgent no personagem

Agora é so colocar as paredes da cena com a tag “Parede”, ou a tag que quiser, é só editar no script.
Não pode esquecer de linkar a variável player com o personagem, ou se colocar o script diretamente no player é so pegar o componente no start:
void Start()
{
player = GetComponent();
}

Se quiser que ele execute uma animação enquanto está se movimentando é só adicionar esse código no update
Captura de Tela (219)

//Editando…
Da pra melhorar esse script, ao invés de procurar a main camera toda vez que apertar o mouse, é melhor ter uma variável de refêrencia no start.

private Camera mainCam;

void Start()
{
mainCam = Camera.main;
}

E mudar o valor de ray:
Ray ray = mainCam.ScreenPointToRay(Input.mousePosition);

Assim é melhor porque antes ele procurava a tag “MainCamera” toda vez, com essa alteração é apenas uma vez no start.

Bom dia
Obrigado.
Passei a noite tentando, mas não consegui o efeito desejado que seria no estilo desse video: https://youtu.be/OXnk5ltwKQk?si=goxgZKqr3oGWgcPJ
https://youtu.be/OXnk5ltwKQk?si=goxgZKqr3oGWgcPJ

Mas qual foi o problema? No script ele tá indo em direção ao clique do mouse

Na hora de dobrar senti dificuldades a dobra saindo muito longe

Ah, acho que eu entendi, eu tive um problema parecido uma vez que eu tava tentando criar um inimigo, na hora de rotacionar ele demorava demais e ficava deslizando pelo chão. Eu tenho um script pronto, a hora que eu chegar em casa já mando, se for isso é simples de resolver.

A dificuldade maior é que para esse jogo so pode usar o click ou o touth pra movimentar e girar. Ele não pode girar movimentando o mouse somente com click pra qualquer angulo que for ate pra fazer uma maobra pra voltar

[SerializeField] float velRotacao;

 NavMeshAgent player;
 Camera myCam;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
  
  player = GetComponent<NavMeshAgent>();
  myCam = Camera.main;

}

// Update is called once per frame
void Update()
{
    if(Input.GetKeyDown(KeyCode.Mouse0))
    {
         Ray ray = myCam.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
    
      if (Physics.Raycast(ray, out hit))
      {
          if (hit.collider.CompareTag("Parede")) return;
          player.SetDestination(hit.point);
      }

    }


     if(player.velocity.magnitude > 0.1)
      {

         Vector3 direcao = player.velocity.normalized;
        Quaternion lookRotation = Quaternion.LookRotation(new Vector3(direcao.x, 0, direcao.z));
        transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * velRotacao);

        //Executar Animacao
      

      }

      else
      {
          //Parar animação
      }
}

Ai o script atualizado, agora tem que colocar ele direto no player, por algum motivo se eu colocava em outro objeto ele bugava, adicionei tambem uma variável pra controlar a velocidade de rotação, tem que mudar o valor no inspetor.
E lembrando também que da pra mudar vários atributos do player diretamente no componente do navMeshAgent, como velocidade aceleração etc etc

Acho que é isso, agora ele rotaciona instantâneamente.

Perfeito .
Muito bom obrigado.