Esta palestra se estende à última palestra, agora movendo nossos personagens em direção a uma
meta, onde eles irão parar. Para fazer isso, você precisará de um local de objetivo.
Criei um cubo simples clicando com o botão direito do mouse em Objeto 3D> Cubo e posicionando-o em algum lugar
do ambiente.
Vamos fazer com que um dos personagens avance em direção à meta, para começar.
Portanto, selecione os personagens que estão em cena e remova o script que já está
anexado a eles.
Agora vamos criar um novo arquivo C # chamado MoveToGoal.
É um pouco diferente do código Move que escrevemos
antes, mas ainda precisamos calcular com vetores e, no início, adicionamos um float para velocidade e defini esse valor como
1. 0
Na verdade, eu posso configurar isso para 2, para que as coisas corram um pouco mais rápido dessa vez.
Então eu tenho uma transformação exposta pública chamada 'goal' que
agora está mudando em relação ao código anterior. Antes, tínhamos objetivo como vetor.
Agora é uma posição no meio ambiente. Dentro do LateUpdate, precisamos calcular a direção.
Este é o vetor entre a posição do objetivo e a posição do personagem. Para fazer isso, simplesmente subimos para
onde estamos indo (para
a posição da meta) menos para onde estamos atualmente.
Então este é 'para onde estamos indo' e é para 'onde estamos'.
Tem que estar nessa ordem.
Se você trocá-los para o outro lado, seu vetor estará voltado para a
direção oposta e seu personagem seguirá o mesmo vetor ...
ou pelo menos ao longo do mesmo tipo de linha em direção ao seu
alvo, mas ele estará viajando na direção oposta.
Se você conseguir que isso aconteça, você sabe que tem essas duas coisas pelo caminho errado.
Depois de calcular o novo vetor para viajar, você novamente usa o seu Translate e coloca o seu vetor
calculado dentro, multiplica pela velocidade
e multiplica pelo tempo. deltaTime.
Então, ainda estamos viajando ao longo de um
vetor, mas desta vez o calculamos.
Então salve isso, volte para o Unity.
Agora você vai querer pegar um de seus personagens e arrastar e soltar esse script do projeto para eles.
Aqui você pode ver que eu tenho o script MoveToGoal anexado e eu configurei a velocidade para 2 (bem, o código fez
assim mesmo).
Segure seu cubo e arraste-o e solte-o como a posição do objetivo.
Agora pressione Play e veja o que acontece.
Assim, seu personagem calculou a direção que ele precisa seguir e chegará ao local do
objetivo e então
meio que para de se mover, mas está tremendo. O motivo é que você ainda está dentro desse loop de atualização, solicitando
que calcule a direção do objetivo e avance para ele.
Agora, na maioria dos casos, você não encontrará o seu personagem no local exato do seu objetivo
e, portanto, precisará incluir algum tipo de cálculo 'o suficiente o suficiente'.
Antes de fazer isso, quero lhe mostrar uma coisa.
Se movermos nosso personagem para cá agora e pressionar Play, ele calculará um novo vetor para o objetivo e avançará
em direção ao objetivo.
Agora, para interromper a oscilação que ocorre quando eles atingem a meta, volte
para o código e queremos colocar algo na atualização aqui para testar se alcançamos nossa meta.
Se atingimos nosso objetivo, não queremos continuar calculando o vetor e movendo-se em direção
a ele.
Então você pode fazer isso testando o comprimento da direção. Você já calculou esse vetor e consegue se lembrar como é
chamado o comprimento de um vetor? É a magnitude.
Então podemos dizer 'se (direção. magnitude> 5), em seguida, vá em direção
à meta.
Então salve isso e vamos dar uma olhada.
Assim, toda vez que o loop e a direção são calculados, cada vez mais
curto, o próprio vetor. Ele não permanece definido para o vetor original. Mesmo que ainda esteja
na mesma direção, será mais curto.
Então agora você pode ver que ele se moveu.
mas não muito longe, e isso ocorre porque uma distância de 5 é
mais ou menos nessa distância, porque esses são pequenos personagens e você deve verificar
a escala que está acontecendo no seu mundo.
Então, vamos voltar aqui e vamos fazer este 1 e executá-lo novamente.
Ok, então isso deve estar a uma distância de 1 do cubo e se clicarmos no cubo e dermos uma olhada no que eu criei, você
poderá ver que a escala é 0. 2)
Isso torna esse cubo (em termos
mundiais) com cerca de 20 cm de diâmetro. Quando um cubo está no tamanho 1, que é o tamanho padrão,
isso seria 1m x 1m x 1m
no mundo do Unity e, portanto, você pode imaginar que 5 desses cubos se encaixariam nesse espaço lá,
a uma distância de 5 a partir de antes.
Agora você pode ver que um ainda é muito grande, se você quiser que seu personagem esteja no topo da localização
do objetivo.
Então, vamos tentar mais uma vez com um valor menor. Volte para o MoveToGoal e mudaremos
para 0. 2f.
Salve isso e execute-o novamente e o
personagem deve estar muito próximo do alvo neste caso,
e você pode ver que ele é, então isso é bastante aceitável.
Vou mover esse valor de 0. Suba no topo, então vamos fazer essa 'precisão de flutuação pública' porque é a precisão
que estamos dispostos a levar até perto de uma meta. Vamos configurá-lo para
0. 01f.
Então, vamos chegar bem perto e, aqui
embaixo, colocaremos precisão ... Curtiu isso.
Tudo bem, então salve isso e vamos voltar e executá-lo e ver se isso faz alguma diferença
com a precisão muito apertada.
Isso é muito bom.
O que eu quero lhe mostrar é algo que fará com que seu personagem ainda tremer com esse
código em particular.
Vamos mudar a velocidade para cinco com essa precisão muito apertada e vamos executá-la novamente Ok,
então o personagem tremeu antes de finalmente chegar a essa precisão.
O que está acontecendo aqui é que ele atingiu a meta, ultrapassou a marca, recalcula a direção
de volta em direção à meta, ultrapassa a marca e acaba saltando assim, porque sua velocidade de 5 pontos aqui está empurrando a meta
e depois empurrando de volta ao objetivo e empurrando-o sobre o
objetivo assim também.
Nesse caso, tivemos sorte em que, eventualmente, ele se moveu para uma posição em que pudesse chegar dentro dessa
precisão,
mas às vezes você não entra nessa precisão e você tem um comportamento realmente
estranho acontecendo até o personagem dançando por aí o ponto do gol.
Isso porque nunca está chegando lá dentro de sua precisão.
Portanto, se você conseguir isso, brinque com seus valores de precisão até que você os levante alto o
suficiente para impedir que isso aconteça; caso contrário, você terá que reduzir a velocidade com que
eles estão atacando sua posição de gol.
Vou colocar essa precisão de volta em 1 para este e
depois para o outro personagem ...
vamos colocar o mesmo código nele e deixá-lo com a velocidade padrão, mas
vamos definir a precisão como 0. 1 em vez de 1.
Também precisamos definir o cubo no local do gol para esse cara aqui e agora, se você
pressionar Play, eles irão para a posição do gol. Como estamos trabalhando atualmente, eles deslizarão da posição atual
para a posição do gol, mas não se virarão e enfrentarão a direção em
que estão viajando e isso
seria uma boa adição para um personagem fazer isso .
Antigamente, tínhamos que calcular os ângulos entre os vetores e de que lado estavam os
vetores, em relação aos outros vetores, para descobrir como mudar seu
personagem.
Agora, temos essa excelente função chamada LookAt that Unity,
que faz todo esse trabalho duro para nós e vou colocá-la na função Start, para que
nosso personagem primeiro se vire e veja para onde está indo.
Esse método ou função é chamado LookAt e você o adiciona ao final da transformação e, em seguida, fornece
a posição do objetivo que você deseja que seu personagem olhe, e ele se moverá e
olhará nessa direção.
Agora, neste momento, se eu executá-lo, porque alteramos a orientação do caractere que o Translate não funcionará corretamente, salvaremos isso
e voltaremos e daremos uma rápida olhada no que você recebe e eu
' Vou mostrar como consertar.
Então, nós entendemos isso e você pode ver que os personagens tendem a se inclinar em
direção a ele, e esse personagem vai girar em espiral até chegar perto o suficiente.
O que está acontecendo é que agora que esses caracteres não estão mais girando
(0,0,0) aqui na transformação.
Se você acompanhou e mudou a rotação de seus personagens, provavelmente não conseguiu descobrir o que
estava errado com seu código,
e esse é o problema exato.
Portanto, no seu MoveToGoal, o que você deseja fazer no seu Translate é 'traduzir'
seu personagem ao longo desse vetor no 'espaço do mundo', em oposição ao 'espaço local'.
Agora, se você salvar isso e correr, verá que seus personagens se voltam para o objetivo deles e
depois viajam em direção a ele. Na cena, tenho essas linhas vermelhas que você teria visto e
estão desenhando os vetores do código com um Debug. DrawRay, que desenha um raio
da posição em uma direção específica e, em seguida, você dá uma cor.
Isso é realmente útil para depuração para ver o que está acontecendo.
Então, acabei de incluir isso, para que você possa usá-lo em seu próprio código para ver quais vetores estão fazendo o que
e para que lado estão apontando.
Tudo bem, então essa é a maneira mais fácil de fazer um LookAt.
Você deve ter notado que, neste momento, se o rodarmos novamente e você agarrar o cubo e na
cena em que você o mover, os personagens responderão à sua localização naturalmente, por causa do
que está nessa atualização.
Observe que o LookAt não está atualizando e é porque ainda está na função Iniciar.
Portanto, se alterarmos esse LookAt aqui e garantirmos que o recalculemos toda vez em nossa Atualização, os personagens sempre estarão
olhando para aquele cubo e, em seguida, o que você poderia fazer é obter um script de condução para poder
conduzir esse cubo com o teclas de seta e os caracteres se moveriam onde quer que fosse.