Nesta palestra, você acompanhará quando começarmos a explorar as Árvores de comportamento e começaremos a
configurar uma Árvore de comportamento muito simples e examinar o nó Sequência.
Agora, se você se apossar do arquivo inicial que acompanha esta palestra e
abri-lo, encontrará na Cena RobotGuard, essa cena em particular. Temos um guarda preto (ele será a inteligência artificial,
o NPC) e temos um verde que você pode dirigir com as setas.
Assim, se você pressionar Play, descobrirá que pode dirigir o robô verde.
Ele já está configurado como um NavMesh,
nesse ambiente específico e, se você pressionar a barra de espaço, poderá disparar. Se você acertar o colisor que está
no próprio bot,
também notará que a barra de saúde na exibição Jogo (aqui) fica inativa.
Também está programado para voltar de forma incremental, para que o bot (se puder se afastar
de você) possa se curar.
Vamos dar uma rápida olhada na maneira como todo esse projeto é configurado.
O personagem preto é chamado de Droid na Hierarquia. Se você selecioná-lo, verá que ele possui um Sphere Collider e isso
está
sendo usado para determinar quando as balas o atingem e
esse é o único motivo para ele estar lá.
Fora isso, o bot está sendo conduzido por um NavMesh e você vê
que adicionei um Nav Mesh Agent aqui. Também ajustei a velocidade e a distância de parada,
para ter a distância de parada como 30, porque mais tarde queremos que o bot nos siga
e não queremos que chegue muito perto quando se aproximar o jogador.
Há também um A. EU. script no bot, que é bastante
simples neste momento e já está configurado com um ponto de desova para as balas, que ficará aqui como
um pequeno cubo anexado a ele que eu tenho aqui como ponto de desova da torre e tem as conchas que usamos no exemplo
do tanque muito antes neste curso, além de poder disparar.
No momento, ele não dispara porque não o programamos com nenhum comportamento; portanto, ele fica lá e
a barra de saúde diminui quando atingimos seu colisor.
Portanto, se dermos uma olhada no código existente, encontraremos todas as coisas
usuais que usamos no passado. Então, nós temos uma transformação pública no jogador para
que o bot saiba
onde ele está, temos seu ponto de desova, sua pré-fabricação de balas, nosso Nav
Mesh Agent, destinos, Temos um objetivo que usaremos um pouco mais tarde para movimentar o bot, saúde, velocidade de rotação,
alcance visível, alcance de tiro e
também temos esse controle deslizante, que é a nossa barra de saúde.
Portanto, o controle deslizante é um objeto de interface do usuário que é ... de volta aqui ...
você pode vê-lo na visualização Jogo
na tela e na Hierarquia, na tela, você encontrará um controle deslizante chamado DroidHealth que foi
configurado.
O controle deslizante tem um valor que varia de 0 a
100 e é esse valor aqui (o valor na parte inferior) que definimos no código
que fará nossa barra de saúde diminuir e subir. Então, voltando ao código, se formos até aqui, há um
método UpdateHealth que está sendo chamado a cada meio segundo, graças a um InvokeRepeating sentado no Start.
Então, isso só vai passar por cima e testar se a nossa saúde caiu abaixo de 100, então
ele apenas irá marcá-lo e reparar o bot.
Agora, a posição dessa barra de integridade (se você não fez nada parecido antes) está na atualização.
Ele manterá esse controle deslizante na tela (assim como
na Interface Gráfica do Usuário) logo acima de onde o bot está sentado.
Assim, à medida que o bot se move,
ele se mantém basicamente, mas como a interface gráfica do usuário e o bot estão em 2 espaços diferentes (um
é um plano 2D
e o outro é um espaço 3D), precisamos converter as coordenadas da posição do bot próprio (que é esta parte aqui) nas
coordenadas da tela com uma câmera. a Principal. WorldToScreenPoint e, em seguida, o
restante do código cuida para garantir que a barra de integridade permaneça acima desse bot e você pode ver
que o valor das barras de integridade também está definido na Atualização aqui.
Agora, mais abaixo, está o código para detectar um hit de bala, que é nosso código OnCollisionEnter, que está
apenas verificando se o bot foi atingido por algo marcado com o nome 'bullet' e, em seguida, a
saúde é reduzida em 10.
Portanto, não há muito código lá porque o agente não está fazendo nada no momento.
Ok, então esse é o A. EU. código.
Agora, outras coisas a serem observadas é que o bot verde (ou nosso personagem, o personagem do jogador) é dirigido
por um código do Drive anexado a ele e que usamos antes para apenas mover
um objeto com as teclas de seta. No Assets, você encontrará uma pasta chamada PandaBehavior
e este é o plug-in
do Panda Behavior Trees, que você pode obter no Asset Store (aqui está, aqui).
Há uma versão gratuita e uma versão paga com alguns recursos extras, mas é bom
termos uma versão gratuita para brincar e você pode ver o valor dela.
Agora, enquanto estou falando sobre isso, há um número de ativos no Asset Store para criar árvores
de comportamento e eles não são gratuitos e também
incluem interfaces gráficas de usuário, para que eles sejam muito mais poderosos do que somos vamos aprender aqui porque
você pode
usar nós de arrastar e soltar e criar uma árvore visualmente para o
comportamento e vincular isso ao comportamento de seus bots específicos.
No entanto, se estivermos aqui, pesquisando e realmente escrevendo código de script para a Árvore de Comportamentos, isso lhe dará uma
melhor noção de como as coisas estão conectadas e como as Árvores de Comportamento funcionam.
Portanto, esta é uma introdução muito boa às
Árvores de Comportamento e, se você quiser comprar um desses outros ativos que possui a
interface gráfica do usuário, fique à vontade e já entenderá o que são as Árvores de Comportamento
e como criar. mais complexos.
Agora isso já está incluído e baixado com o arquivo que você acabaria de abrir, para que você
não precise fazer isso novamente.
Vamos começar criando um script realmente simples que fará com que o Droid vagueie. Ao programar o 'passeio', se você pensar
em NavMeshes, a maneira que você faria isso é escolher um destino aleatório no NavMesh
e fazer com que o robô se mova em direção a ele.
Agora o NavMesh está fazendo todo esse trabalho para nós.
A única coisa que realmente precisamos verificar é se o bot terminou de chegar ao ponto de destino e podemos
incluir todas essas funcionalidades em uma Árvore de Comportamento realmente simples.
Então, primeiro, criaremos a Árvore de Comportamento. Portanto, em Projeto, selecione "Criar". Agora você não o verá
aqui, porque está fora da minha tela e fica bem embaixo quando você tem o plug-in do
Panda BT, ele diz 'Script do Panda BT'.
Portanto, crie um novo e eu o adicionarei ao ativo.
Vamos chamar de 'Wander. BT '. Realmente não importa como você o chama, desde que saiba o
que é.
Então aí está a sua Wander. BT.
Agora, neste (vamos abrir), você obterá uma estrutura muito simples de uma árvore muito básica.
Primeiro de tudo, o nível superior da árvore que você irá executar deve ser chamado de nó 'Raiz' e você
pode ver que
lá e, embaixo, existe um Sucesso.
Portanto, este é um nó raiz, por si só.
Não tem filhos e está tendo sucesso, por isso sempre será verdade. Vai deixar a árvore
continuar correndo.
Agora, isso se chama Wander, mas ainda o chamaremos de 'Root' porque é o primeiro nó da nossa árvore.
À medida que avançamos na árvore, cada estrutura sucessiva de ramificação e nó deve ser tabulada em uma para que
ela funcione.
Então, se eu fizesse isso, isso seria um erro, porque você não pode ter 2 nós raiz.
Então, seria assim, onde você terá seu nó inicial e um ramo indo
direto para o
Sucesso, mas não faremos isso. Vamos nos livrar do Succeed e substituí-lo por uma 'sequência'.
Portanto, essas palavras são palavras que o compilador de scripts do Panda BT sabe o que são e sabe que, depois de colocarmos um
nó de 'sequência', vamos dar a ele uma série de nós de folha ou podemos até dar um ' sequência 'ou' seletor ',
se você quiser se aprofundar cada vez mais na árvore.
Nós não estamos neste momento, então vamos dar a nós 2 filhos, que serão as ações que queremos que
nosso bot execute.
Portanto, o primeiro chamaremos
PickRandomDestination e o segundo chamaremos MoveToDestination. A ortografia deles deve ser perfeita e quero dizer que da maneira
que ESTA ortografia deve corresponder ao nome de um método que você agora escreverá no
seu A. EU. Arquivo.
Caso contrário, você receberá um erro obviamente.
Portanto, observe como você soletrou essas duas coisas e também as separou.
Certo, então esse é o fim desta Árvore de Comportamentos.
Então, salve isso, volte para o Unity e vamos abrir o arquivo de script do AI.
Aqui é onde adicionaremos 2 métodos que correspondem aos 2 nós de folha que acabamos
de adicionar na Árvore de comportamento. Então aqui embaixo, vamos adicionar isso.
O primeiro é chamado PickRandomDestination, que está escrito exatamente o mesmo na Árvore Beahvior aqui.
Agora, de volta à IA. No arquivo cs, estamos
criando o método PickRandomDestination e observe que, de antemão, é precedido por este pequeno [Task]
e isto está dizendo à Behavior Tree (o
sistema Panda BT) para selecioná-lo como uma tarefa, que o ligará novamente a o nó da folha no seu arquivo BT.
Ele sabe que, porque no topo do código (se
voltarmos aqui), temos nossa biblioteca do Panda incluída.
Direita.
Então, vamos voltar aqui em baixo.
Tudo o que estamos fazendo no PickRandomDestination é criar um ponto no mapa que esteja entre
-100 e 100.
Se você der uma olhada no avião que está em cena, na verdade ele está sentado em
0, 0, 0 e, portanto, permaneceremos em 0 na direção y, mas basta encontrar um ponto que esteja dentro de 100 raios do
bot em si e depois usaremos esse ponto como destino para o Nav Mesh Agent. Neste ponto, estamos retornando
uma tarefa 'Succeed'.
Portanto, você deve enviar uma mensagem de sucesso de volta à Árvore
de Comportamentos, caso contrário, ela não continuará executando sua sequência.
Agora você pode ver isso na próxima tarefa, que é MoveToDestination, e neste
código, também incluímos algumas informações de depuração que são bastante úteis quando você está executando uma Árvore de Comportamentos, para ver onde as
coisas estão funcionando e quando elas ' não está funcionando.
Então, isso está dizendo quando a tarefa está sendo inspecionada (e está no depurador
que mostrarei a você daqui a pouco), em seguida, ela imprimirá (ao lado desta tarefa,
no depurador) uma string, formatada como 't = 'e então isto aqui e imprima a hora e este formato de string, você pode
colocar qualquer coisa aqui.
Então, mais tarde, quando estivermos girando o bot através de certos ângulos, você pode
colocar o ângulo aqui para que você possa depurar facilmente enquanto avança, onde as coisas podem não estar funcionando para você.
Então esse é um pequeno recurso interessante disso.
Agora, a outra coisa que temos aqui, que na verdade está fazendo todo
o trabalho nessa tarefa em particular, é apenas testar se o agente chegou ao seu destino.
Então, nós estamos fazendo um 'agente. restanteDistância <= agente. stoppingDistance 'e isso
diz que estou no meu destino. Agora também estamos testando esse agente. pathPending é falso.
Se agente. pathPending é true, significa que o Nav
Mesh Agent não concluiu o cálculo de um caminho e se você tentar executar essas tarefas fora de sincronia com o NavMesh se atualizando, essa
tarefa poderá realmente falhar, em vez de ter êxito.
Portanto, quando você define esse destino aqui, não pode ter certeza de que ele calculou o caminho e, portanto,
começará a movê-lo antes que esta tarefa aqui em baixo seja executada.
É por isso que eu tenho isso aqui e ele voltará e tentará novamente.
Portanto, é sempre bom ter isso. Se você deixar de fora, provavelmente encontrará
um erro nos cálculos do NavMesh ao tentar fazer isso.
De qualquer forma, se chegamos ao destino, estamos retornando um 'Sucesso' para a Árvore de Comportamento, que diz que terminamos
e que faria com que ambas as coisas terminassem, o que faria com que toda a
árvore terminasse.
Certo, agora você
conseguiu, salve-o e voltaremos ao Unity.
Nós vamos para o Droid. O que você vai fazer é adicionar à Árvore de Comportamentos.
Então, primeiro, vá em 'Adicionar componente> Comportamento do Panda'.
Adicione isso e então ele tem um 'Count'. Este é o número de
scripts da Árvore de Comportamento que você adicionou ao seu bot e você pode colocar mais de 1, estamos usando
1 neste momento.
Você terá um 'BT Script 0' escrito aqui. É aí que arrastamos e soltamos nossa Wander. BT, então
arraste isso para lá. Você poderá ver imediatamente a pequena árvore que você escreveu
nesse arquivo
e, enquanto a executamos, você verá essas coisas rodando e mudando de cor.
Então é aqui que a depuração acontece, no Inspetor.
Então pressione Play para executar isso e você verá que o agente começa a se mover imediatamente.
Você pode ver na depuração que o PickRandomDestination foi executado e teve êxito
porque é
verde e, em seguida, você vê MoveToDestination.
Vê como tem um temporizador ao lado?
Esse é o nosso código de depuração aparecendo, para que você saiba que está fazendo isso. No momento, também temos essa árvore
marcada como 'Repetir Raiz', então ela continuará vagando, vagando e
vagando, e é isso que
esse agente está fazendo. É escolher um destino aleatório e passar rapidamente
para passar para o destino.
Agora, a outra coisa que também está acontecendo com essa árvore de comportamento é a atualização.
Então, o que acontece com todos esses nós é que eles são processados a cada atualização, um nó por vez (e você
pode alterar isso para diferentes tipos de atualizações aqui em cima). A maneira como uma Árvore de Comportamento
é atualizada é chamada de 'Tick'. Assim, em algumas Árvores de Comportamento, você poderá definir isso manualmente e dizer que deseja um tique
de 1 segundo.
Nesse caso, ele está vinculado ao Unity MonoBehaviour para que ele funcione e atualize com, nesse caso, atualização
que pode ser tudo o que você deseja. Vamos deixar este exercício aqui e veremos mais
de perto as sequências na próxima aula.