Até agora, vimos algumas árvores de comportamento seqüencial bastante simples.
Agora vamos adicionar uma condição que testa se algo é 'verdadeiro' ou 'falso' antes que a Árvore
de Comportamento continue
sendo executada e, portanto, adicionamos um 'Nó de Decisão' no código.
Nós vamos fazer isso dentro do nosso ataque,
mas antes de tudo, precisamos escrever nosso método que tomará a decisão por nós.
Atualmente estamos atacando o tempo todo. Você realmente quer que o bot ataque, se ele puder
realmente ver o
jogador e, nesse caso, quando você começar, não poderá porque o jogador está atrás de um muro.
Além disso, se o jogador estiver fora do alcance visível, você também não quer que ele ataque.
Agora, se você se lembrar no topo deste programa, há um visibleRange e um shotRange configurados,
portanto esse visibleRange (que é 80) vai determinar se o jogador está dentro de 80 unidades do bot,
então ele pode vê-lo . Ele também testará ao mesmo tempo se não houver barreira entre o
jogador e o bot, o que é uma boa situação inimiga, porque você deseja que o bot esteja ciente de que há infraestrutura em torno dele.
Portanto, como o último método aqui embaixo do Fire, adicionarei um novo método que usaremos em nosso código da
Árvore de Comportamento.
Então, é chamado SeePlayer.
É um
booleano, como é o que tínhamos antes, mas desta vez vamos usá-lo como um teste lógico na
Árvore de Comportamento.
Então, o que isso está fazendo é calcular o vetor do bot
para o
player e também teremos um RaycastHit.
Então, transmitiremos ao longo desse vetor de distância para ver se atingimos algo e se atingimos algo (que é, neste caso, uma parede),
então obviamente não podemos ver o jogador porque há uma parede na estrada. temos
um
pequeno bool definido aqui, dizendo 'seeWall = false' para começar.
Eu também estou fazendo uma depuração. DrawRay no ambiente, para que possamos ver onde esse vetor
de distância está sendo projetado.
Isso é muito bom se você estiver tentando depurar visualmente o que está acontecendo e onde estão seus vetores.
Eu sempre uso isso.
Agora ele vai projetar um raio, fazer a física. Raycast como fizemos antes e depois veja se
atingimos algo chamado "muro".
Se tivermos, o seeWall será igual a 'true'.
Agora, por um momento, de volta à Unity, se você for ao Mapa e soltá-lo, há todas essas paredes e cada uma
delas foi marcada com 'parede' e é assim que a Física. Raycast está indo para o trabalho.
Agora, certifique-se de que seu raio que você está projetando realmente atravesse a parede (ou qualquer outro objeto que você esteja tentando
detectar como um obstáculo) e é por isso
que esta depuração. DrawRay é uma ótima idéia.
Depois de fazer isso, também estou imprimindo o valor seeWall em algum código de depuração da própria Árvore de Comportamento, para que você possa vê-lo
quando estiver trabalhando nos diferentes nós e no que eles estão fazendo, o que
também é bastante útil.
Finalmente, para determinar se podemos ver o jogador ou
não, o teste é: Se a magnitude dessa distância do vetor de direção entre os dois jogadores
for menor que o alcance visível E não houver barreira no caminho. Desta vez, não estamos preocupados se o bot está na direção
certa ou não.
Então, vamos imaginar que ele tenha um pequeno sistema de radar a bordo e não precise estar
olhando em uma direção para saber se o jogador está por perto. Agora, se o jogador estiver nesse raio
e não houver barreira no caminho, retornaremos 'true' ao ver o
jogador; caso contrário, retornaremos um 'false'.
Portanto, este é o método para o nosso novo nó.
Ok, salvaremos isso e entraremos no script de ataque, e o que faremos é
adicionar um novo nó em nossa árvore acima da 'sequência'. Então, aqui em
cima, agora vou adicionar isso. Portanto, o código é 'while SeePlayer' Agora este nó
'while' é um nó de teste especial e permitirá que você execute algo que seja um valor verdadeiro ou falso
e até inverta-o
para verificar (não precisa ser verdadeiro para executar, também pode
ser falso) e não impedirá a execução da sua árvore.
Ok, então você pode até colocar, por exemplo, 'embora não seja o SeePlayer', se você quiser mudar a lógica e faremos um pouco
mais tarde, mas não neste caso aqui.
Agora, esse nó 'while' pode ter apenas 1 filho.
Portanto, precisamos garantir que recuamos tudo isso dessa maneira, caso contrário, o sistema da Árvore de
Comportamento reclamará disso.
Portanto, agora a sequência de filmagens só acontecerá se o método SeePlayer nos der um 'verdadeiro' aqui.
Então, vamos salvar isso e vamos testá-lo.
Então, de volta ao Unity, clique no Droid para verificar se o script está ok e você receberá um texto rosa onde
tudo está bem com o script Attack.
Ok, vamos pressionar Play e dar uma olhada no que obtemos.
Então, na Árvore do Comportamento, enquanto o SeePlayer está sentado lá, wall = True, você pode ver isso lá.
Você também pode ver na cena que o raio de depuração atravessa e atinge a parede, o que está causando
o 'wall = True' aqui e está nos tornando para que não possamos ver o jogador.
Vamos colocar o
jogador à vista, então, se eu virar a esquina e pronto. Assim que eu aparecer e estiver dentro do alcance visual, o Droid
começará a disparar e se eu
me virar e voltar novamente, ele parará assim que houver uma parede na estrada.
Se eu atravessar esse muro porque não sou constrangido como jogador pelo NavMesh,
ele não poderá mais me ver. Se eu voltar, ele voltará e, por causa do código anterior, ele também será
voltado para o jogador, a fim de filmar e você poderá
ver a Árvore do Comportamento passando bem com esse pouco de lógica. Então você está começando a ver o poder das
Árvores de Comportamento, que você pode criar um monte de métodos que executam uma única ação para o
seu jogador e, em seguida, pode reuni-los na Árvore de Comportamentos, o que facilita muito para alguém quem não
está realmente familiarizado com o código, mas
também cria seu A. EU. bastante poderoso, onde você pode misturar e combinar comportamentos diferentes. Apenas por interesse, vamos
voltar ao Attack e alterar esse código no topo com a declaração while para ser um "não" e reverter essa lógica, para
que, quando NÃO VÊMOS o jogador, vamos ataque o jogador, o que não faz
sentido lógico, mas o que isso significa é que, enquanto você não está na visão visível do bot com
seu personagem, ele estará atirando em sua direção.
Então apenas salve isso. Enquanto estou
aqui, também devo mencionar essa declaração while por causa da programação
normal, você vai pensar que a declaração significa 'looping'. No caso das árvores de comportamento, isso não significa loop.
Portanto, este não é um loop.
Se alguma coisa, é uma declaração if,
se você quiser pensar nisso como algo, então não fará com que isso
circule por aqui e é chamado de 'while'. Certo, então salve isso. Vamos voltar e dar uma olhada em como isso afeta nossa Árvore de Comportamentos.
Então, pressione Play e esperamos que levemos um tiro imediatamente porque não conseguimos ver o
jogador.
Agora, se eu avançar para o alcance, não seremos atingidos e, de fato, toda a
sequência para de correr, por isso nem vamos virar e olhar para o
jogador porque esse trecho aqui não está sendo satisfeito, na medida em que ser capaz de ver o jogador.
Direita.
É assim que você também pode adicionar lógica.
Agora você não precisa usar o 'enquanto não' nesse caso, porque o SeePlayer pode fazer parte da sequência.
Se você colocar o SeePlayer na sequência (vamos voltar aqui e tirar isso de lá e colocá-lo
aqui
em baixo), é legitimamente permitido que falhe ...
e como essa é uma sequência, o restante não será executado de qualquer maneira, então vamos salvá-la e dar uma
olhada nela.
Verifique se está recarregado aqui.
Agora temos uma sequência. Se pressionarmos Play ... ok, não podemos ver o jogador.
Então a sequência parou com o SeePlayer e vamos tentar nos aproximar dela para ver o que acontece ...
ele disparará o SeePlayer e
o restante será executado como antes.
Portanto, nesse caso, a declaração while não está nos ajudando com o SeePlayer, porque precisa ser verdadeira para
que o restante do código seja executado.
Portanto, neste caso, o que fizemos foi virar a árvore de cabeça para baixo, na medida em que este
SeePlayer agora é um Nó Folha, enquanto antes era um Nó Decorador porque tinha filhos por baixo e estava permitindo que
você tomasse uma decisão. e a decisão nesse caso se aplica quando você deseja inverter o valor que
sai dela.
Portanto, o 'enquanto não' será muito mais comum nesse caso específico, mas depende do que você está tentando
fazer.
Então essa é
a sequência e também a adição dessa lógica. No próximo vídeo, veremos os nós do seletor.