Até agora, criamos um monte de pequenas árvores de comportamento e agora é hora de reuni-las.
Se desenhá-los em um diagrama, eles se pareceriam com isso e
o que você verá na tela é uma representação próxima do que estamos caminhando, mas
não está completo (por qualquer meio) porque não há o suficiente espaço na tela
para fazer isso, mas você pode ver as principais áreas. Você pode ver todas as principais árvores que criamos até agora
e todas as maneiras pelas quais elas estão interconectadas.
A questão é: como você os junta?
porque não são uma 'sequência' e não são algo que deva ser selecionado. O que eu fiz aqui é apenas uma
maneira de estruturá-los logicamente e você verá que há um novo tipo de nó
adicionado na parte superior chamado 'Paralelo'. Paralelo permite que você corra 2 ou mais lados da árvore
de uma só vez (neste caso, são apenas 2) e um lado é chamado de Patrulha e o outro lado é chamado
de Morto.
O lado morto está pegando o código que já escrevemos para a árvore morta.
A Patrulha combina todos os comportamentos que o bot pode fazer quando estiver vivo.
Queremos que os nós no Patrol sejam executados em um tipo quase de ordem seqüencial, para que, a cada Atualização, o bot
verifique se deve Fugir, Atacar, Olhar ao Redor ou Desviar.
Começaremos indo direto para a árvore de
comportamento da AI do bots, que combina tudo o que fizemos até agora.
Portanto, crie um novo script chamado 'BotAI. BT 'e nisso combinaremos todas as árvores.
Você não precisa colocar todas as árvores em um arquivo, você pode colocá-las em arquivos separados
e anexá-las ao comportamento do Panda anexado ao seu agente.
No entanto, acho muito mais fácil ver o que está acontecendo quando estamos depurando se eles estão todos em
um único arquivo.
Então, aqui está como eles serão.
Primeiro de tudo, começamos com o nó 'Root' da nossa árvore.
É aqui que a árvore começará a correr.
Então temos o nó 'paralelo', que executará seus filhos ao mesmo tempo e você
pode ver que há uma árvore chamada Patrol que será executada e uma árvore chamada Dead.
Já escrevemos o Dead.
Eles são prefixados por um nó 'repeat', um nó 'mute' e, é claro, pelo nó 'tree'. O nó 'repeat' continuará
repetindo (repetidamente)
essa parte da árvore inteira. 'mute' não se importa se o nó abaixo dele é bem-sucedido ou falha,
apenas continua executando-o.
Então, está dizendo "Não ouça se você é bem-sucedido ou não", que permite que essa
árvore
morta aqui, quando seu agente não está morto, continue correndo e verifique se o agente está morto.
Agora, o que há em cada uma dessas árvores?
Você verá que é uma parte separada no código para cada árvore, então há Patrulha ... e aqui está o ataque e cada um é
nomeado.
Eles não têm mais a raiz no topo.
Eles precisam de um nome para descobrir como estão todos ligados.
Agora você pode colocar isso em uma grande árvore sem todas essas pequenas subárvores, mas isso
se tornaria uma bagunça e muito difícil de depurar. A árvore Patrulha tem uma sequência e ela chama a árvore
'Fugir', portanto, vamos verificar se podemos fugir.
Isso também continuará dizendo: 'enquanto nossa saúde não for inferior a 40',
faremos nossa pequena
sequência de Attack, LookAround e Wander. Este é o código para a árvore do Attack, extraído diretamente do nosso pequeno
arquivo que criamos antes, para o Attack.
A única diferença é que eu mudei o Attack aqui, que tinha Root de volta no arquivo Attack, se eu o encontrar ...
é só lá, você pode ver e é o mesmo para todos os outros. Então Dead está aqui em baixo.
Temos Flee, LookAround e depois Wander.
Então, depois de conseguir isso, você pode salvá-lo e deseja ir ao seu Droid e defini-lo como sua Árvore de
Comportamento.
No momento, não precisamos alterar nada no código da classe AI porque não criamos
novos métodos.
Sua árvore, se estiver rosa e vermelha durante todo o percurso, significa que está pronta para ser usada, e
encontrou todos os métodos necessários.
Ok, então vamos pressionar Play e ver o que acontece.
Certo.
Se formos até o inspetor e dar uma olhada, as duas coisas 'paralelas' estão funcionando e o bot
em si está apenas sentado lá ... sob patrulha. Ele disparou o 'Fugir' e o Fugir que ele
disparou está aqui embaixo e está dizendo 'enquanto IsHealthLessThan (40. 0) ', portanto, ele não pode satisfazer esse nó
e, portanto, nada mais será executado. Aqui em cima, onde esse Flee está
sendo chamado, está falhando nessa árvore; portanto, nada mais está acontecendo porque uma sequência não
continuará quando um nó falhar; portanto, imediatamente temos um problema com nossa árvore não sendo capaz de continuar. e passar
por todos os processos que o bot pode fazer quando ainda está vivo.
Agora, o mesmo aconteceu com a árvore morta, mas tudo bem, porque nosso bot não está
morto, por isso está preso nesse 'IsHealthLessThan (0. 1) 'o que não é, então não vai explodir imediatamente.
Está tudo
bem, está funcionando paralelo aqui em cima.
O problema está aqui com o Flee, que queremos continuar.
Portanto, se essa árvore (para Flee) falhar, ainda queremos que ela vá e verifique as outras.
Então pare de jogar e eu apresentarei um novo tipo de nó. Volte para o seu código de árvore bot. No Patrol, faremos 2
alterações. Onde houver 'sequência'
aqui, chamaremos isso de 'fallback' e essa outra 'sequência' aqui
em baixo, chamaremos isso de 'fallback'.
Agora, o nó de fallback é um nó de sequência, mas permite que os nós abaixo dele falhem.
Portanto, mesmo que eles falhem, ainda assim continuará executando as coisas por baixo e é isso que
queremos usar neste caso, porque Flee falhará quando não precisarmos fugir e coisas como Wander e LookAround, eles
falharão quando estivermos
ao alcance do jogador e, na verdade, estamos atacando-o e o ataque falhará
quando o jogador não
estiver por perto, então precisamos permitir isso.
Então salve isso agora e vamos voltar aqui e pressione Play novamente.
Agora, quando o rodarmos, você descobrirá que o bot se moverá e responderá ao código que lhe permite
mudar porque estamos definindo nosso fallback: Attack (que falha porque não pode atacar no momento), então
ele tem uma árvore LookAround (que você pode fazer e, portanto, apenas
olha em volta).
Você verá que o Wander não está sendo acionado, não está chegando tão longe
e, se olharmos para o LookAround (vamos descer ainda mais), você verá que dentro do LookAround,
não há nada aqui que
possa causar falhar enquanto estiver saudável e longe do jogador. Assim, podemos forçá-lo a falhar de vez em
quando, para permitir um retorno de chamada, até a árvore Patrol que chamará Wander, para que o
LookAround possa terminar. Realmente não tem um estado final.
Acho que é isso
que estou dizendo e queremos que volte aqui, para que Wander possa correr.
Então
pare de jogar, abra
seu código novamente e, no LookAround, adicionaremos outro nó nessa sequência.
Então, depois de esperarmos um período aleatório de tempo, colocaremos outro 'aleatório'
aqui e, quando criança, colocaremos 'Fail' e 'Succeed'. Tão aleatoriamente, ele falhará ou será bem-sucedido, o que o jogará de volta desta árvore
para a árvore Patrol, onde será permitido seguir para o Wander. Salve isso e
pressione Play.
Tudo certo.
Então o Droid agora fez um LookAround, mas também acionou um Wander, como você viu acontecer
lá e depois volta para o LookAround ...
e quando isso falhar, ele vagará novamente e aqui você pode vê-lo sair vagando.
Agora, se tivermos sorte ...
sim,
conforme passa por aqui, o que aconteceu foi que o ataque foi acionado e é
porque ele tem um SeePlayer, um TargetPlayer e um LookAtTarget, que é o que fez com que ele se voltasse
para o jogador e você não quer
que isso aconteça, a menos que seja na verdade no modo Ataque.
Agora ele entrou aqui (novamente no modo Ataque) e está começando a atacar nosso lpayer
porque o encontrou, o que é interessante por si só, mas nós realmente não queremos que isso
aconteça, então precisamos adicionar mais algumas instruções condicionais no nossa árvore para fazê-la se comportar exatamente como queremos.
Quando o bot vê o jogador e vai atacá-lo (ou sabe que é capaz de atacá-lo), ele deve
ser capaz de se mover em direção ao jogador também, para que ele fique dentro do alcance e possamos modificar o script de ataque para fazer isso
.
Então, de volta à nossa completa
Árvore de Comportamentos, substituiremos a sequência de Ataque que tínhamos antes por algo um pouco mais complicado.
Então deixe-me colocar, certo, então eu vou explicar e explicar.
Primeiro, vamos verificar se podemos ver o jogador no
ataque, antes de continuarmos
e, se pudermos, iniciaremos uma sequência que faz o TargetPlayer, LookAtPlayer. Então teremos um retorno
em 2 'whiles'.
O primeiro será
'enquanto
ShotLinedUp' e depois 'enquanto não ShotLinedUp'. Se um tiro estiver alinhado, a sequência será 'Wait and Fire', que tínhamos
antes, para o disparo.
Se a foto NÃO estiver alinhada, queremos 'SetTargetDestination' e 'MoveToDestination'.
Então, definir o destino alvo será definir o jogador como esse alvo específico.
Os dois novos métodos aqui, que temos que escrever e adicionar ao script AI são
ShotLinedUp e SetTargetDestination.
Então, voltemos a esses scripts e, na parte inferior, sob as outras tarefas, vamos adicioná-los.
Portanto, o primeiro é SetTargetDestination.
Já definimos o alvo em si porque usamos (em nosso script) o TargetPlayer, que define esse valor para que
seja igual à posição do jogador.
É por isso que estamos definindo apenas um destino
de destino aqui em baixo, e o que está fazendo é dizer ao nosso NavMesh para avançar agora em direção ao destino.
O próximo é o ShotLinedUp, que está retornando um 'verdadeiro' ou 'falso'
se conseguirmos atirar no jogador.
Então, novamente, esse é um problema do tipo visibilidade, em que testamos a distância dentro do valor da faixa
de tiro (que é definida na parte superior) e que o ângulo entre o vetor para frente do seu agente e
o vetor para o alvo é menor que 1 (um ângulo estreito pequeno).
Se for, então podemos atirar.
Caso contrário, moveremos e ajustaremos nossa posição para nos aproximarmos do jogador.
Portanto, salve isso
e vamos voltar para o Unity e pressione Play para ver como isso acontece agora.
O bot vai olhar em volta e também vagar. Agora, quando passa pelo jogador dessa
vez, ele percebe o jogador e se vira para ele e está entrando para um ataque.
Então, em vez de ignorar completamente e dizer "eu não te vi", ele nos viu,
então agora podemos voltar e começar a atirar nele, neste momento, para
que sua saúde diminua.
Lá vai, vai se afastar ...
encontre um esconderijo ...
Agora, se apenas deixarmos em paz (não podemos vê-lo lá, podemos?
Vamos apenas nos mover.
Está bem).
Quando a saúde estiver acima de 40, ele voltará a fazer o que estava fazendo antes, que está
olhando ao redor e vagando e agora não vai atacar, a menos que nos encontre novamente ou vamos nos aproximar e
tentar atirar nele.
O tempo todo, a saúde continuará aumentando.
Ok, então essas são árvores de comportamento em poucas palavras.
Ainda há muito para você aprender. O que eu sugeriria é que
agora que você conhece o caminho, eu iria ao pandabehaviour. com, de onde o plug-in do PandaBT vem e lê a
documentação, porque é muito útil ver quais nós estão disponíveis, o que eles fazem e como você
deve estruturá-los.
Além disso, faça o download do plug-in completo do Panda Behavior na Asset Store, pois há alguns ótimos exemplos que o acompanham
e alguns deles são realmente bastante complexos e mostram como fazer coisas incríveis com
as Árvores de Comportamento.