Nesta palestra, examinaremos mais de perto os agentes de navmesh. Para começar, faça o download
do projeto NavMeshStationStarter que acompanha esta palestra.
Quando você o coloca, você encontrará um extenso mapa lá dentro.
Este é o mapa que acompanha a demonstração do Angry Bots,
muitas versões do Unity atrás.
Eu retirei a maior parte do código e você encontrará apenas a geometria. Vamos usar isso como
um 'centro de recreação' para nossos agentes.
Agora vou dar um zoom neste pedaço
aqui e também mudei minha câmera para que ela fique olhando quando pressiono Play.
Então vá em frente e selecione esta área aqui.
Também criei 2 materiais que você não terá nas suas coisas. Eu criei um
material azul e um material vermelho. Isso é apenas para que possamos colorir os agentes à
medida que os criamos, para poder distinguir a diferença entre eles.
Em seguida, configuraremos a navmesh, portanto, verifique se você tem sua janela de navegação em algum lugar do seu projeto. Para isso,
é 'Janela> Navegação'. O próximo passo é selecionar a geometria no seu mapa que você
deseja tornar parte da navmesh.
Então, procure as partes individuais deste modelo (de modo que os polígonos individuais) e selecione-as com a tecla Shift até
que você tenha a maior parte da área em que deseja que os agentes possam se mover.
Então, queremos poder descer o corredor, portanto, adicione isso e talvez essas plataformas.
Se você quiser que eles possam pular adiante mais tarde, adicione-os.
Se você não selecionar todos eles de uma só vez, poderá voltar e obtê-los mais tarde.
Cada uma das malhas que você selecionou precisa ser configurada para ser uma Navegação estática.
Portanto, selecione o Inspetor, ainda com tudo o que está selecionado na
cena, e queremos subir para Static e soltar o menu para baixo e verifique se clicou em
Navigation
Static, para que a navmesh possa buscá-la. Depois de configurá-los (deixe-me configurá-lo
novamente
porque eu posso ter desativado), volte para a guia Navegação
e, em Assar, clique em [Assar]. Agora, os bits que fazem parte da navmesh ficam azuis. Nesse ponto, se você perdeu
alguma coisa (digamos que você queira que este bit seja incluído aqui), você
pode voltar e selecioná-lo por si só, acessar o Inspetor e, novamente, 'Static> Navigation Static', voltar para
na navegação e em Bake, pressione [Bake] e ele será adicionado.
Então você pode fazer um pouco de cada vez e continuar adicionando.
Agora, se você vir algo como eu tenho aqui, onde não é azul nem
azul,
é apenas um problema de renderização sobreposto.
Portanto, tente não se preocupar muito com isso.
O problema será que, se seus agentes não passarem por aquela área, ele não
foi escolhido para a navmesh e apenas voltou, selecione-o novamente e verifique se você
definiu como Navigation Static e depois ' assar '.
Agora é hora de adicionar um agente.
Então, vamos diminuir um pouco a partir daqui.
Vou entrar na Hierarquia e adicionaremos um novo 'Objeto 3D> Cápsula' e esta cápsula
será nosso A. EU. personagem e vamos deixar esse vermelho para que
possamos vê-lo, basta arrastá-lo para lá.
Agora vamos precisar enviar alguns comandos para esse personagem e faremos isso marcando-o, para que
possamos encontrá-lo. No Inspetor,
você deseja criar uma nova tag chamada 'ai' (que eu já criei), então crie isso e
defina sua cápsula para isso. Nesse ponto, você pode alterar o nome disso. Vamos chamá-lo de 'RedAgent'.
Vamos transformá-lo em um pré-fabricado um pouco mais tarde e, em seguida, você pode fazer várias cópias deles.
O importante nesta fase é que seja marcado como 'ai'.
Agora vou criar um script chamado AIControl, portanto, no projeto, crie um script C #,
chame-o de AIControl e você deseja anexá-lo ao RedAgent.
Agora abra-o e por dentro queremos agarrar o agente navmesh que está anexado ao nosso personagem.
Primeiro, adicionamos a biblioteca para acessá-lo, então 'Usando o UnityEngine. AI; ' então criamos uma
variável para armazenar o link no agente Então 'public NavMeshAgent agent;' e então, no início, configuramos o
componente que está nele.
Então, é isso. GetComponent 'com NavMeshAgent, assim.
Agora, quero programar o agente para que ele se mova para um local rápido na tela e eu possa fazer
isso dentro da atualização para esse agente específico, mas
se quiser ter várias cópias desse agente em todo o local, Não quero que todos executem sua
própria atualização com as instruções 'if', verificando se há cliques no mouse e esse tipo de coisa.
Então, em vez de fazer isso, criarei um Agent Manager.
Vamos seguir em frente e apenas remover esta atualização porque eu não quero que uma atualização vazia
processe nada, porque causará um atraso significativo se você tiver muitos agentes tentando executar uma atualização vazia e,
portanto, precisamos apenas de uma atualização que enviará o mensagem através de todos os agentes.
Então, vou salvar isso, voltar aqui para o editor e, na Hierarquia, clicar com o botão direito do
mouse em Criar vazio e dar o nome de AgentManager e, em seguida, o
que também farei é criar um script chamado AgentManager. Esse script é anexado ao nosso
objeto de jogo AgentManager (engraçado) e, em seguida, dentro do script, vamos adicionar isso.
Portanto, esse script possui uma variedade de agentes no topo, que são preenchidos quando começamos a jogar.
Então 'agentes' serão preenchidos com todos os objetos do jogo na cena que possuem a tag 'ai'. É por isso que 'ai' é tão
importante que você marcou seus agentes com ele e, em seguida, clicar no ambiente para fazer com
que o agente se mova para lá acontecerá na Atualização.
Portanto, não importa quantos agentes você tenha marcado como 'ai' em sua cena, essa mensagem será enviada a eles.
Portanto, se você clicar em um botão do mouse (nesse caso, o botão esquerdo do
mouse), criaremos um
RaycastHit. Usaremos um raycast de física a partir da posição de entrada do mouse por meio de um ScreenPointToRay para que ele atire uma
linha reta a partir da posição de o mouse na tela entra em cena e
descobre onde ele bate, a uma distância de 100.
Se você achar que não está acertando nada e estiver clicando em todo o
lugar, aumente esse número aqui, para produzir um raio mais longo. Então, dentro da declaração 'if', temos um foreach e
isso apenas circula todos os agentes da matriz e, para cada
um deles, ele pega o script AIControl e obtém o agente que nós apenas configuramos
para eles.
Como na última aula, usamos o SetDestination e ele passará pela posição de
onde o clique do mouse estava. Portanto, é um valor Vector3 que entra aqui, para o agente navmesh
e, como o agente navmesh já está configurado para se mover automaticamente, ele começará a
se mover em direção a esse ponto de impacto.
Então, vamos salvar isso e
voltar ao editor, vamos pegar nosso RedAgent que possui o script, mas ele ainda não possui
um agente navmesh, então apenas [Add Component]> Nav Mesh Agent.
Não precisa fazer mais nada com isso, apenas deixaremos os valores padrão lá.
Certo, pressione Play e poderemos clicar em algum lugar na área que definimos para a nossa navmesh e você
verá que o agente agora se moverá.
Agora, se você quiser se mover um pouco mais rápido, podemos selecionar o agente e entrar
no Inspetor e procurar a Velocidade.
Portanto, atualmente está definido como 3. 5 como padrão.
Podemos definir isso para 10, se você quiser que ele vá muito rápido e pressione Play.
Na verdade, tendo dito isso, não acho que 10 seja tão rápido quanto você imagina. Também posso clicar aqui, porque essa é a minha navmesh
e a única maneira de entrar nessa área é se você passar por esse pequeno túnel.
Agora você viu lá que ele ficou um pouco preso, ou melhor, onde seria o
caminho.
Isso é devido à velocidade e à aceleração e esse tipo de coisa, além da frenagem.
Deixe-me parar com isso por um segundo.
O que eu quero lhe mostrar é que, se você for para a janela Navegação e selecionar seu agente
e pressionar Play, poderá ver a navmesh e como ela funciona.
Ao clicar na superfície, você verá o caminho que é calculado. Então, digamos que você queira ir
até aqui.
Você pode ver todos os polígonos escolhidos como parte do caminho. O agente em si também termina com alguns
vetores, mostrando a direção em que ele está viajando e como está
se movendo, para onde está
voltado e esse tipo de coisa também. O local em que o agente pode
se mover pela navmesh depende do 'Tamanho do agente cozido'. Na janela Navegação, em Bake, há um tamanho de agente cozido
que você já viu antes e alterar os valores determina o modo como o tamanho da malha de navegação é gerado.
Por exemplo, o raio do agente, se aumentarmos isso para dizer que nosso agente é bastante amplo e depois refazer a instalação,
o que você fará é encontrar áreas estreitas pelas quais ele poderia passar antes que agora se
acabem.
Assim, por exemplo, o agente não pode mais descer por esse túnel porque era realmente uma das
seções mais
estreitas e, apesar do fato de que se você selecionar essa guia 'Agentes' aqui em
cima e ver o que está acontecendo aqui, você pode modificar o tamanho de qualquer tipo específico de agente que veremos
mais adiante, ainda não tem efeito algum sobre esse tamanho de agente cozido.
Portanto, é o Tamanho do agente cozido que determina como a malha de navegação é gerada na superfície do seu ambiente, NÃO
o tamanho dos agentes individuais que você pode criar. Você pode ter humanóide, zumbi, peixe, o que quiser, pode ter
todos os tipos diferentes de A. EU. mas eles não afetarão o
cozimento da navmesh, isso afetará aqui.
Portanto, se levarmos de volta para 59 e refazermos a remarcação, teremos nosso pequeno caminho novamente por baixo desse túnel.
Mesmo se eu tivesse um agente diferente aqui e ele fosse absolutamente
enorme e fosse maior que 0. Em um raio, ele ainda seria capaz de seguir o caminho e trabalharia
o seu caminho através da geometria, então provavelmente não é algo que você deseja e você PODE controlar isso, mas não aqui.
A outra coisa que você pode definir é a inclinação que o agente pode descer.
Então, se eu simplesmente mudar isso e dar uma olhada aqui embaixo, nesta área de lounge há uma inclinação dessa plataforma para
lá e podemos mudar isso na área de Assar. No momento, o 'Max Slope' que o agente pode navegar
está definido como 45.
Se disséssemos que esse agente simplesmente não pode usar inclinações, defini-lo como 0 e refazê-lo, você verá
que agora não há caminho que o agente possa seguir para chegar lá.
Agora, ao remover isso, você também pode ter perturbado o caminho de onde o agente está atualmente em
outro lugar e vamos dar uma olhada aqui. Você pode ver que o caminho sobre esta seção aqui também se foi.
Agora, mesmo que eu pressione Play neste momento, posso clicar legitimamente nessas áreas, mas o agente não pode chegar lá.
Então, se eu clicar aqui, ele pode
ir para lá, mas se
eu tentar convencê-lo a entrar aqui, ele seguirá o caminho o mais longe possível até que fique preso.
Agora você pode ver, neste caso, o
que aconteceu, está aqui agora, é porque tentou calcular o caminho mais curto para chegar até aqui e porque não podia
ir por esse caminho, percorreu toda a volta e depois conseguiu o mais perto possível, mas
não conseguiu alcançá-lo.
Então, se clicarmos aqui, o agente pode vir aqui, mas,
é claro, não pode passar por lá porque
não há caminho. Se clicarmos nesta área aqui, novamente, não há como chegar
lá, para que ele ganhe ' t, mesmo que tente. Abaixo, onde você define a Inclinação máxima, também é possível definir a altura
da etapa,
e isso é realmente ótimo se você tiver um ambiente com várias etapas e desejar que
seus agentes cuidem das coisas. Nesse ambiente, não
há realmente nenhuma etapa, mas deixe-me dar uma olhada.
Há um contêiner aqui.
Agora, neste contêiner, você pode navegar por cima, se já
estiver em cima. Não há caminho para subir em cima deste contêiner.
Se eu selecionar esse contêiner (e vou movê-lo para lá, onde podemos vê-lo claramente, vamos tirar a caixa
da estrada) e, se assarmos agora, você verá que no topo, mas ainda não conseguimos chegar
lá. É muito alto.
Então, eu vou movê-lo um
pouco para o chão, talvez sobre ... lá e pressione [Bake]. Agora, quando pressionamos Play, veremos se conseguimos superar isso.
Então, vamos até lá e o agente se aproxima, mas ele não pode ficar por cima. Então está perto, mas não exatamente.
Vamos apenas dar um passo mais alto.
Você não pode dar um passo mais alto que seus agentes.
Portanto, o Unity o impedirá se você tentar fazê-lo.
Ok, agora o que você pode ver é que ele desenhou o lado da caixa aqui, o que mostra claramente que o caminho para
essa etapa existe.
Então agora, quando eu pressiono Play e clico na caixa, ele aparece em cima.
Então lá está, e ele também poderá descer novamente.
Portanto, é como a altura do salto, bem como para subir escadas. Só para finalizar esta palestra,
o
que vou fazer é voltar ao Bake e aumentaremos nossa inclinação novamente para
que possamos entrar nessa área e assá-la. Ok, ele traz esse caminho de volta
aqui e, em seguida, com o próprio agente (nosso RedAgent), podemos apenas pressionar Ctrl-D e fazer várias cópias dele.
Agora eles serão exatamente iguais.
Todos eles terão a mesma tag 'ai', o que significa que o AgentManager os buscará e enviará qualquer
mensagem de clique para eles, que definirá seu destino. Agora, antes mesmo que eles se
mexam, sua física não os fará colidir um com o outro e eles não usarão seu próprio
sistema de evitação para evitar um ao outro, porque não provocamos isso.
Mas assim que eu clicar aqui, todos eles se abrirão e agora você poderá vê-los trabalhando juntos
para obter o mesmo local.
Mas tudo o que eles estão fazendo é apenas tentar chegar onde você clicou e evitar um ao outro.
Assim, você pode ter quantos desses caras vermelhos
quiser e o AgentManager os buscará automaticamente para você.
Tudo bem, então esse é o básico da criação de um único agente e de algumas das nuances do mapa
e da configuração das áreas navegáveis por lá. Na próxima palestra, veremos como adicionar um tipo de agente
diferente para
termos 2 e restringir aonde eles podem ir.