Nesta palestra, veremos como configurar vários navmeshes e atribuir caracteres de tamanhos
diferentes a diferentes.
Isso permitirá que você especifique onde diferentes tipos de caracteres podem e não podem se mover. Para acompanhar, faça o download
do arquivo AgentSizesStarter que acompanha esta palestra e abra a cena BridgeTest.
Nessa cena, você encontrará 2 caracteres. Temos um guarda e uma garota;
se você girar, verá que também temos uma muralha do castelo com buracos de tamanhos diferentes.
Então, o que faremos é fazer a garota (que é o modelo menor) passar por essa abertura estreita e garantir que o
guarda não possa passar por lá porque ele é muito grande.
O mesmo para aquela ponte ... ela será pequena o suficiente para atravessar a ponte, mas ele não.
A primeira coisa que você precisará fazer é configurar esses caracteres para uso no Unity.
Esses são os personagens que eu trouxe de Mixamo. Eu consertei os materiais deles, mas não fiz
mais nada, por isso vamos passar por toda a configuração de suas animações.
A primeira coisa que você precisa fazer é selecionar cada modelo e defini-lo como Humanoid.
Então, estou selecionando Andrômeda (que é a garota)
e no Inspetor, quero ir para 'Tipo de animação> Humanóide' e pressionar [Aplicar].
Então você quer fazer o mesmo pela guarda do castelo ... selecione-o no seu projeto e crie um humanóide a
partir dele e pressione [Aplicar].
A próxima coisa a fazer é configurá-los com o conjunto strafe.
Agora, este projeto já tem as animações e os scripts para esse conjunto de strafe incluídos.
Abra a pasta Animações e é aqui que você encontrará o controlador
de animação 'Locomotion' criado pelo Unity. Selecione a proteção do castelo e, no Inspetor, você encontrará o slot do controlador vazio.
É aí que você deseja arrastar e soltar esse LocomotionController para lá.
Faça o mesmo para Andrômeda também.
Então, basta selecioná-la na Hierarquia e arrastar e soltar esse LocomotionController para ela. Em seguida, você deseja adicionar
o script ClickToMove.
Portanto, se formos para a pasta Scripts, esses são os mesmos que vêm com os caracteres do conjunto strafe.
Se você selecionar seu personagem (então Andrômeda, nesse caso), arrastaremos e soltaremos o ClickToMove para ele e
também o script LocomotionSimpleAgent.
Não vou me preocupar com o script LookAt.
Você pode configurar o LookAt, se quiser. Faça o mesmo com a guarda do castelo ... queremos arrastar
ClickToMove e o script LocomotionSimpleAgent para lá.
Agora, isso adicionará automaticamente o componente Nav Mesh Agent a cada um deles, porque o LocomotionSimpleAgent
e o ClickToMove exigem isso. Agora também precisamos fazer uma malha do nosso mapa. Portanto, selecione o mapa
e queremos configurá-lo para Navigation Static e todos os filhos que estão abaixo dele, porque
isso incluiria o solo e tudo mais.
Acabei de notar que a ponte em si não faz parte do mapa.
Vou adicionar isso lá em baixo e também podemos tornar essa navegação estática.
Então selecione o Mapa, vá para a guia Navegação (abra essa janela, se não a tiver) e
iremos para Assar e apenas [Assar] como está por padrão.
Então você pode ver lá que você recebe uma malha de navegação que cobre tudo e então
há uma muito estreita que atravessa a ponte.
Se você verificar todos os links, descobrirá que há um passo e um toque suficientes
onde essas malhas se juntam.
Portanto, com essa configuração como
padrão, se pressionarmos Play e clicarmos aqui, descobriremos que nossos agentes vão dar uma caminhada para chegar ao
outro lado.
Agora, atualmente, não definimos tamanhos diferentes para os diferentes agentes, eles
são apenas o mesmo agente padrão e tudo é baseado no tamanho do agente cozido que está na navegação.
Agora, enquanto eu
estava rodando, você deve ter notado um pouco de 'nervosismo' no movimento dos personagens.
Vamos dar uma olhada mais de perto nisso.
Primeiro de tudo, vamos desligar a proteção do castelo para que ele não esteja lá e faremos isso em Andrômeda.
Então selecione Andromeda para que você possa ver o cilindro do agente de navmesh dela, e também ela,
e pressionaremos Play e
o que está acontecendo nesse script é que ele está tentando alinhar as animações com o cilindro e, quando fica
nervoso, você ' verei que ela realmente está à frente desse cilindro com suas animações ...
logo ali, você pode ver isso acontecendo.
O motivo é que a animação é uma animação em execução mais rápida que a velocidade que você está
permitindo que o agente se mova.
Portanto, para corrigir que você precisa selecionar o personagem no Inspector e para o Nav Mesh Agent, aumente
a velocidade e isso ajudará bastante a
corrigir esse nervosismo. Então, vamos fazê-la acelerar 8.
Vamos voltar para o guarda_do castelo e ligá-lo novamente, e mudaremos sua velocidade também para 8, o que tornará o
movimento para eles muito mais suave.
Agora ele pode atravessar a ponte porque não temos restrições quanto ao tamanho.
O que faremos agora é criar um tipo diferente de agente e atribuí-lo ao castle_guard, então
vamos parar de jogar.
Em seguida, na janela Navegação, em Agentes, criaremos outro tipo de agente.
Temos um humanóide lá, mas
clique em '+' para criar um novo agente e chamaremos este de Guarda e depois
modificaremos o tamanho.
Então, vamos fazê-lo 1 rodada e vamos
definir sua altura para 3. A altura do degrau ainda deve estar boa, porque está certo o caráter básico
(o humanóide) que deixaremos no modelo de Andrômeda.
Agora, para atribuir esse 'Guarda' ao castle_guard, clique
no castle_guard e vá ao Inspetor.
Dê uma olhada no seu componente Nav Nesh Agent,
onde você tem o Tipo de agente e é lá que você deseja configurá-lo como 'Guard'.
Então isso lhe dá um tipo diferente.
Agora, neste ponto, se pressionarmos Play, obteremos um erro comum que as pessoas estão recebendo.
Portanto, pressione Play e clique aqui. O erro diz que 'SetDestination só pode ser chamado em um agente ativo que
tenha foi colocado em um NavMesh '.
O que é verdade, no sentido de que a malha de navegação na
Navegação (aquela que você criou) está apenas trabalhando nesse humanóide padrão, mas você tem outro agente chamado 'Guard' que você acha que está
sentado na mesma malha de navalha , mas o UNITY está dizendo "Não, eu não sei".
Então, o que precisamos fazer é usar algum código beta que foi desenvolvido e ainda não faz parte do Unity, mas você
pode obtê-lo e colocá-lo no Unity.
Então, ao invés de usar ESTE gerador de navmesh, vamos usar um gerador diferente.
O que eu quero que você faça é trazer o pacote chamado 'AINavMeshComponents' que
veio com esta palestra e vou arrastá-lo e soltá-lo na pasta Assets.
Agora, existem
vários scripts diferentes que podemos aplicar. O que nos interessa é o
que nos permitirá ter vários navmeshes em nosso mapa. Então selecione o pai do terreno (que neste caso é o nosso
mapa) e vá para o Inspetor.
Queremos encontrar a pasta Scripts que acompanha nossos NavMeshComponents recém-importados, que está aqui
e você está procurando o script chamado NavMeshSurface, e é esse que
queremos arrastar e soltar em nosso Mapa. Também podemos selecionar [Adicionar componente] e encontrá-lo nesta lista também.
Na verdade, precisamos de 2 deles, então colocaremos outro lá. Queremos uma superfície para o Humanóide e
uma superfície para a Guarda, para que esta possa ser deixada
como Humanóide e, em seguida, a próxima abaixo, podemos defini-la como Guarda.
Agora, se você clicar em [Bake] para os dois, você verá diferentes navmeshes e poderá vê-los em cores
ligeiramente diferentes.
Então você tem um aqui e você tem um lá e também
tem o antigo pendurado no padrão. Se voltarmos à janela Navegação e [Limpar] essa, não será um problema
para nós, porque não precisamos mais dela.
Então, de volta ao
inspetor e podemos ver esses dois.
Agora, o que aconteceu aqui é que a água foi recolhida como parte de nossa navmesh.
Não queremos que a água seja incluída.
Então, nas configurações do Nav Mesh Surface, podemos ir para 'Include Layers'
e atualmente tem tudo, mas podemos descer e selecionar 'Water' para desmarcá-lo e ignorá-lo, e podemos fazer
isso nos dois tipos diferentes de navmeshes e depois [assar] os dois de volta.
Então você verá que a água está agora excluída.
Então a Guarda (castle_guard) viaja em uma malha e o Humanóide (Andrômeda) viaja na outra
e você pode ver sobre a ponte que somente Andrômeda é capaz de viajar porque o agente da Guarda é muito grande.
Então, vamos tentar isso.
Vamos pressionar Play ... e descobriremos que, se clicarmos aqui, temos Andrômeda atravessando a ponte e
a Guarda atravessando a água.
A outra coisa que temos também (se você apenas aproximar o próprio castelo) é que Andrômeda pode passar por
baixo, através desta pequena parte da ponte estreita e as
duas podem atravessar a mais ampla.
Então, se eu voltar ao jogo e clicar aqui, você verá que ela passará
pelo meio porque ela pode se encaixar, enquanto ele tem que dar a volta pelo lado de fora,
mas se nós
os movermos para cá e perguntarmos se eles vierem para cá, os dois passarão por aquela ponte porque podem caber.
Você pode adicionar tantas superfícies de malha de navalha diferentes ao seu terreno quanto tiver tipos diferentes, e essa é a única
maneira de PODER ter tipos diferentes de agentes. Mesmo que a janela Navegação permita que você
tenha vários tipos de agentes, a menos que você use essas superfícies, a navegação padrão em que você
utiliza, usando esta parte aqui, não encontrará seus outros tipos de agentes e você obterá (como vimos
) erros.
Então, isso está usando várias malhas e vários tamanhos de agentes.