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
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
//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.