Nesta palestra, gostaria que você acompanhasse enquanto examinamos o movimento ao longo de uma linha reta usando vetores.
Faça o download do projeto de recursos que acompanha esta palestra. Lá você encontrará um personagem / homem e,
além disso, está sendo adicionado um script Move e é o script Move em que vamos trabalhar.
Então abra isso e dê uma olhada aqui.
Você pode ver no script que existe um Vector3 que é uma meta.
Portanto, o Vector3 é uma versão 3D do nosso vetor que tem um x, ye z, e estamos inicialmente configurando esse vetor para 5
na direção x, 0 na direção y e 4 na direção z. Como esse é um personagem humanóide em uma
superfície plana, quando o movemos,
não adicionamos nenhum 'y' porque você não quer que ele suba e flutue no
ar.
Se fosse um avião ou algo que voasse, seria completamente diferente.
Observe também que não há nenhuma física envolvida neste projeto.
Estamos movendo esse caractere puramente usando nosso próprio código e é para que possamos manter o controle dele.
Agora, na função Iniciar, estamos adicionando nosso Vector3 à posição atual de nosso personagem.
Então, aqui temos uma transformação e estamos executando um Translate.
O que isso faz é adicionar o 'vetor objetivo' ao 'vetor de transformação'. Com isso salvo, volte ao Unity
e pressione Play.
E o que você verá é seu personagem pular 'essa distância' ao longo desse vetor. Por estar na função Iniciar, está adicionando
todo
o lote de uma só vez e movendo seu personagem para esse objetivo.
Agora isso não
vai funcionar se você quiser mover o personagem pouco a pouco na atualização e
parecer que está se movendo. Então pare de jogar. Vamos voltar para o Move e dar uma olhada
em mover este Translate para baixo na Atualização.
Livre-se do primeiro e salve-o, volte para o Unity e pressione Play.
E o que você notará é que o personagem desaparece completamente, mas se você selecionar o
Homem na Hierarquia, dê uma olhada na transformação e a posição nos x e z estão subindo e subindo
e subindo e isso é porque todo esse vetor está sendo adicionado sempre que uma atualização ocorre.
Então ele está se movendo, ele está pulando muito e se afastando cada vez mais, para
que não possamos vê-lo. Então vamos parar com isso.
O que queremos, em vez de pular para a posição de meta, é avançar pequenos passos por aqui,
exatamente na mesma direção desse vetor.
Portanto, para obter uma versão menor do vetor, você pode dividir o vetor maior por um número que dará algo menor.
Então, se voltarmos para o Move e no Start,
vamos para goal = goal * 0. 5f; e isso vai reduzir pela metade o tamanho da meta.
Então agora ele deve se mover na mesma
direção, mas você deve vê-lo parar no meio do caminho e pular para o local do gol.
Mas depois disso ele continuará pedalando e adicionando a meta. Salve isso, volte para o Unity, pressione Play.
Você provavelmente o viu pular um pouco lá e foi ele se movendo nessas etapas, ainda um grande salto, mas apenas
metade do vetor de cada vez.
Então, vamos voltar para o Move.
O que acontece se multiplicarmos por 0. 01, obtemos 10% desse vetor.
Qualquer coisa que você multiplicar ou dividir no vetor ainda estará exatamente na mesma direção em que
você deseja que seu personagem vá.
Então, vamos jogar este, dê uma olhada.
Isso é muito mais suave no movimento e ele está se movendo em direção ao local do gol.
Agora, a localização do objetivo em si não era uma posição no espaço.
Foi uma "direção do gol".
Portanto, há uma diferença entre um ponto e um vetor. Um ponto é um ponto fixo em algum lugar do seu mundo.
Um vetor é apenas um conjunto de instruções de qual direção se mover, de qualquer local do mundo.
Portanto, seu personagem agora está em algum lugar, se você clicar nele, ainda se movendo a 10% do
'objetivo' de cada vez.
Agora, se simplesmente multiplicarmos "nosso vetor, queremos que nosso personagem se mova" por um número
pequeno, sempre que esse vetor mudar, isso afetará a velocidade de nossos caracteres.
Ele não estará se movendo a uma velocidade constante e podemos ilustrar isso adicionando outro personagem.
Então, antes de tudo, tornemos público nosso objetivo de vetor, para que possamos alterá-lo, e ainda o
multiplicaremos por 0. 01 e traduza ao longo disso.
Então apenas salve isso.
Agora, se voltarmos para a Unity, faça com que o Homem e apenas Ctrl-D dupliquem e depois o movam para fora e tentem colocá-lo nessa
direção, queremos que eles se movam paralelos um ao outro.
Então, eu só quero colocá-lo lá.
Mas para esse cara, seu objetivo de movimento, vamos multiplicá-lo por 2.
Portanto, é duas vezes mais longe.
Está aqui em algum lugar.
Então, vamos fazer 10, 0 e
8.
Então agora, quando executamos, veremos velocidades diferentes. veja como esse cara está indo muito mais rápido,
porque 10% desse vetor mais longo será um salto maior que 10% do menor.
Portanto, eles não estão em uma velocidade uniforme e isso tornará o movimento do seu personagem inconsistente quando
eles estiverem se movendo ao longo de diferentes vetores de comprimento.
Portanto, a questão é como podemos obter
um vetor de tamanho padrão, que aponte na mesma direção ao longo do vetor em que estamos viajando.
A solução é obter sua versão 'Normalizada'. A versão normalizada de qualquer vetor é um
vetor com 1 comprimento e é possível encontrar a versão normalizada de um vetor dividindo cada
um dos valores x, ye z do vetor pela magnitude.
Agora você também pode obter o Unity para fazer isso por você.
Vamos voltar ao movimento e, em vez de ter nosso objetivo aqui,
estamos avançando multiplicado por 0. 01 apenas para torná-lo muito menor, queremos torná-lo em um tamanho padrão.
Então, vamos nos livrar disso completamente e
o que estamos tentando fazer é traduzir o objetivo. normalizado ... assim e que será um
vetor de comprimento de unidade 1 indo na mesma direção.
Agora, quando você joga, isso provavelmente será longe demais.
Então, se voltarmos e executá-lo. Sim, você pode ver que eles se moviam na mesma taxa,
mas era bastante nervoso e era um grande salto a cada atualização.
Mas agora sabemos que temos um movimento de unidade 1 padronizado a cada atualização e agora que temos isso, podemos
multiplicar isso por um valor de velocidade para mudar a rapidez com que nosso personagem está indo.
Então, vamos criar outra 'velocidade de flutuação pública' e definiremos isso (porque queremos
torná-lo um pouco mais lento) 0. 1f e multiplique seu objetivo normalizado pela sua velocidade ... assim e agora porque é público, você pode
alterar a velocidade de cada um desses personagens,
mas deixaremos 0. 1 para os dois porque queremos vê-los se movendo na mesma taxa. Pressione Reproduzir ...
e lá vai você ... e eles continuarão para todo o
sempre, porque, embora tenhamos dado a eles vetores iniciais completamente diferentes, eles estavam apontando na
mesma direção
e depois foram normalizados até a unidade
1, e acabaram exatamente com o mesmo vetor multiplicado exatamente na mesma velocidade.
Portanto, não importa quanto tempo o vetor seja, se você o normalizar, você acaba com o mesmo
pequeno vetor da unidade 1.
Agora, essas velocidades, mesmo que você ache que é uma velocidade consistente, o outro fator envolvido
(volte para o seu código de movimento) é a velocidade com que esta atualização ocorre porque toda vez que seu jogo executa uma
atualização, não é necessariamente exatamente a mesma hora em que a última atualização aconteceu.
Portanto, você obterá inconsistências na velocidade e, embora provavelmente nem perceba isso, verá em muitos códigos que as
pessoas se multiplicam pelo tempo. deltaTime e o
que isso faz é suavizar e permitir a diferença na atualização em execução.
A outra coisa que devo dizer também antes de terminarmos é tornar este LateUpdate.
Qualquer movimento que você tenha sobre seus personagens (e especialmente quando você começar a adicionar câmeras
que acompanham as coisas), você quer que tudo aconteça
depois que toda a física tiver sido calculada na cena.
Atualmente, não temos física, por isso não é um problema, mas você deve adquirir o hábito de colocar seus movimentos no
LateUpdate, o que eu ainda não sou e fique à vontade para me corrigir o tempo todo,
se eu tiver um loop de atualização com o movimento em porque eu sou obrigado a, porque esse é um mau hábito meu.
Portanto, isso deve ser tudo o que precisamos agora para ter um bom movimento suave e consistente de nosso caráter.
Salve isso. Vamos voltar para o Unity e pressionar Play ... e agora...
bem, essa velocidade é bem pequena, não é?
Você pode dizer que a multiplicação do tempo. O deltaTime também diminuiu bastante o
ritmo, porque será um valor bastante pequeno devido à diferença
de tempo entre os loops de atualização e, portanto, isso permite que você brinque com as velocidades que você está definindo em seus personagens. Então, talvez, em vez de
0. 1, convém alterá-los para 1 e experimentá-lo.
Isso é um pouco melhor, mas esse é realmente o código que você deve usar quando parar de mover um personagem.
Tudo bem, então é isso para mover algo em linha reta e
como obter velocidade consistente nos movimentos do seu personagem. Na próxima palestra, começaremos a procurar avançar em direção a uma meta e transformar
nossos personagens.