Como mencionei na palestra anterior, desenvolvendo o A. EU. para uma multidão de NPCs é muito
mais simples do que a maioria das pessoas pensa. Isso ocorre porque, a partir de regras simples, um
comportamento complexo pode se desenvolver e, embora não estejamos programando os chamados cérebros dos NPCs, eles ainda parecem se mover
com algum nível de inteligência.
Nesta palestra, exploraremos ainda mais as multidões com um grupo de personagens animados. Para acompanhar, faça o download do
'StreetSceneStarter' que acompanha esta palestra. Como você verá quando abrir a cena (que é
chamada de Multidão),
há um grupo de pessoas e elas estão de pé em um avião.
Se você for para a janela Navegação, verá que há uma malha de navegação que já está sendo
preparada.
Portanto, não estamos buscando um ambiente complexo neste momento,
estamos apenas buscando algo em que as pessoas possam passear.
Agora, cada personagem foi baixado do Mixamo e eles já têm uma animação.
Então, se você selecionar, por exemplo, essa garota aqui (Garota_3), descobrirá que elas têm um Controlador de Animação e
eu
configurei esse controlador para você.
Portanto, se você clicar duas vezes para abri-lo e dar uma
olhada no que está lá, verá que eles têm uma animação inativa, uma animação ambulante e uma animação em execução, e essas animações são
configuradas para serem ativadas entre si.
Então, eu criei transições de Idle para Walking e, em seguida, novamente e o
mesmo para todos os outros estados.
E então, para cada uma, para as transições, temos gatilhos.
Portanto, temos um gatilho 'isRunning', um gatilho 'isWalking' e um gatilho 'isIdle', e vamos
controlá-los e quando eles forem disparados a partir de algum código. Os próprios personagens também têm um agente de
navmesh anexado que você encontrará no Inspetor e a velocidade deles é definida como 2.
Então, neste caso, eles só têm animações que eu estou fazendo com que andem e fiquem ociosos. Também há uma corrida, então eles são animações
em movimento para a frente.
Não há uma configuração 'strafe set' porque esse movimento não é particularmente complexo, pois é bastante simples
e
eles estão se movendo em linha reta quando se animam
para a frente e se você pode coordenar a velocidade do seu Nav Mesh Agent com o velocidade
que está na própria animação, é bastante crível e é muito mais simples para nós.
Acho que também queria mostrar uma maneira diferente de fazer isso, se você não quiser
se esforçar na complexidade de criar um 'conjunto de strafe' ou se não tiver as habilidades necessárias para criar
tudo. essas diferentes animações.
Portanto, a velocidade é definida como 2 para todos eles.
Agora, se pressionarmos Play, eles vão direto para a animação Idle e estão todos sincronizados, para que
pareçam um flash mob no momento!
Para começar, vamos levá-los a caminhar em direção a uma meta.
Determinaremos o objetivo colocando um cubo em cena.
Então, vá para a Hierarquia, clique com o botão direito do mouse e crie um novo cubo e depois vamos movê-lo para algum lugar
na navmesh.
Então, vamos colocar aqui.
Enquanto estamos nisso, criaremos outro também para que eles possam se mover entre locais, então pressione Ctrl-D
e depois mova outro cubo para lá.
Eles meio que se movem entre esses dois objetivos. Posso renomear esses 'Objetivos' (para que saibamos o que
são)
e você também pode excluir os renderizadores,
se não quiser vê-los. Também vou me livrar da colisão deles, porque não queremos que
isso interfira em nada.
Agora, a fim de encontrar os objetivos, vamos marcá-los.
Portanto, vá até o Inspetor e, com as metas selecionadas, no menu suspenso Tag, identifique-as
como meta.
Se você não tiver "objetivo" como tag, será necessário adicioná-lo e defini-lo como "objetivo".
Agora, observe a ortografia ... esse é 'objetivo' em minúsculas, que é o que iremos referenciar em nosso código.
Agora vamos adicionar um código para controlar o movimento dos caracteres. Vá para a pasta Assets e lá você
encontrará um script 'AIControl' que eu incluí neste arquivo inicial. Basta abrir isso e dar uma
olhada.
Agora deve ser bem familiar, porque já fizemos todas essas coisas antes.
Antes de tudo, estamos configurando uma variedade de locais de objetivos (que serão esses cubos) e depois
também pegamos o NavMeshAgent que está em nossos personagens.
Nesse ponto, na função Iniciar, obteremos todos os locais da cena que possuem a tag 'objetivo' e é por isso
que é importante que você tenha 'objetivo' marcado
exatamente com a mesma ortografia / caso como esses cubos e você pode adicionar quantos
quiser na cena.
Em seguida, o agente está agarrando sua malha
de navegação e, em seguida, o agente está tendo seu destino definido para um local aleatório nessa matriz.
Então, nós estamos usando um Random. Alcance o comprimento da matriz goalLocations apenas para selecionar
uma e depois se apossar de sua posição, que será o destino do agente.
Então salve isso e vamos anexar isso a cada um de nossos personagens. Portanto, selecione todos eles e
arraste e solte o script 'AIControl' no Inspetor.
Agora pressione Play e você poderá ver os personagens escolhendo um local para onde ir.
Então, eles escolhem aleatoriamente a localização e mudam para ela.
O que você também notará neste momento é que eles ficam na animação inativa.
Então, se você deseja sincronizar sua animação com o movimento do seu personagem ou o que quer que ele esteja fazendo,
é necessário acionar uma dessas transições que eu mostrei antes. Para fazer isso, vamos voltar ao
código e precisaremos pegar o componente animador que está em nosso personagem, assim como
tivemos que pegar o agente para a navmesh. Assim... 'Animator anim;' depois, no Start,
você também precisará configurá-lo para 'anim = this. GetComponent 'com o Animator e, no início, porque
eles estão caminhando imediatamente, podemos acionar. Então, para
fazer isso, vamos anim. SetTrigger ("isWalking"); ' e salve isso. Isso aqui deve ser exatamente a
mesma ortografia e letras maiúsculas que o animador. esses valores aqui.
Então 'é' com um pouco de 'i' e 'W' com uma capital. Agora, se você pressionar Play, verá que eles vão direto para a animação
de andar e escolhem um objetivo aleatoriamente para ir e caminhar
até ele e depois caminhar por ele, porque não lhes dizem para parar de andar uma vez eles chegam lá.
Então, pare de jogar isso. Agora, se você quiser outra meta, basta selecionar sua meta
na Hierarquia, Ctrl-D para duplicá-la e adicionar outra.
e eles já estão codificados para selecioná-los aleatoriamente.
Então, você descobrirá que eles não escolheram aleatoriamente o novo.
Vamos apenas pressionar Play novamente.
Lá vamos nós, algumas pessoas têm agora.
O que faremos é quando eles chegarem ao local aleatório,
queremos que eles escolham outro local aleatório e acessem o local. Descobrir quando você está em um local e depois escolher outro local para ir é
praticamente os mesmos passos que demos quando movíamos
o tanque e patrulhávamos entre diferentes pontos de referência, por isso é o mesmo tipo de lógica.
Abra seu código. Na atualização, o que faremos é testar se alcançamos o
destino (ou
se estamos a uma certa distância do destino, nosso objetivo) e, em seguida, escolheremos outro.
Então, o código, vou colar aqui e depois passar por ele.
Ele diz 'se a distância restante do agente', então o Nav Mesh
Agent tem esse valor chamado 'Distância restante', que monitora a distância que o agente está da meta de destino.
Agora, se o agente ficar a <1 distância do cubo de meta,
ele definirá outro local aleatório e a configuração do local aleatório (este código aqui) é
exatamente o
mesmo código com o qual escolhemos o primeiro local aleatório, aqui em cima .
Portanto, são todas as linhas de que você precisa e, se
você salvar e voltar para o Unity
e pressionar Play, agora descobrirá que os agentes chegarão a um local e depois se voltarão e se moverão para outro lugar.
A virada do agente real ... se selecionarmos um deles em movimento, você poderá ver se acessamos a visualização de cena que o
próprio código do Nav Mesh Agent faz toda a mudança para você.
Anteriormente, quando estávamos trabalhando com o tanque e girando-o, teríamos que
executar um slerp e empurrar o tanque para frente.
Então esta é a navmesh fazendo tudo isso por nós. Nós apenas mantemos a animação
avançando e ela reagirá muito bem para nós, sem que façamos qualquer esforço extra.
Agora, se você quiser uma multidão maior, basta selecionar e alternar
todos os caracteres e pressionar Ctrl-D para duplicá-los. Depois, é possível afastá-los um pouco do
outro, assim e depois se você pressionar Play, eles ainda
se comportarão da mesma maneira, porque eles têm o mesmo código ... eles estão na mesma navmesh e têm o mesmo conjunto
de metas para selecionar. Com o que temos (e antes de avançarmos para
a próxima palestra), o que eu
quero é montar essa cena de rua para que as pessoas subam e desçam a calçada, como você encontraria em uma cidade. Antes de tudo, vou remover esse objetivo (porque não precisamos disso) e vou
agarrá-lo e colocá-lo em
um extremo da rua e esse objetivo e colocá-lo no
outro extremo. Então eles
vão subir e descer essa parte da calçada. Para impedir que eles entrem aqui (que é onde você pode ter prédios ou algo
assim), podemos apenas simular esses prédios com um cubo.
Então, vamos criar
um cubo e eu vou trazê-lo aqui e redimensioná-lo ...
e quando tiver algo que
lhe agrade, você pode selecioná-lo, ir até a janela Navegação e queremos fazer desta uma área 'não passível de ser percorrida'.
Portanto, na guia Objeto, você pode torná-lo
Estático da Navegação, mas na Área de Navegação, você pode soltá-lo e dizer que é 'Não pode ser percorrido'.
Então, quando você voltar ao Bake, isso
excluirá isso, de modo que quando as pessoas começarem a andar (se pressionarmos Play), elas estarão subindo e descendo a calçada ...
e evitando essa área aqui.
Alguns deles realmente escaparam, podemos
dizer, ao redor da borda, para que você pudesse agarrar esse cubo e torná-lo muito mais
amplo, preenchendo
todo o bloco e que os dissuadisse de pegar o atalho e levá-los até aqui .
Claro, se você começou todos os seus personagens por aqui, eles não vão dar a volta por todo o lado.
Então, com isso redimensionado, se eu simplesmente for [Bake] novamente e pressionar Play. Lá estão eles,
voltando para aquele lado e queremos que eles subam e desçam aqui para a próxima palestra, na qual adicionaremos alguns obstáculos.