Nesta segunda aula sobre nós Sequenciais, veremos mais de perto como eles funcionam e alguns dos problemas que você
pode ter quando tenta criar seus próprios e executá-los.
Então, primeiro de tudo, vamos criar uma nova Árvore de Comportamento baseada no 'Wander'. Então crie um novo.
O que eu costumo fazer é apenas duplicar o que eu tenho e vou chamar isso de Patrulha. BT.
Vamos fazer com que o bot patrulhe pelo mapa, então definiremos os destinos nos
cantos específicos.
Agora é lembrado o que estava em Wander, porque era uma duplicata.
O que queremos fazer é poder dizer aonde ir, em vez de escolher um destino aleatório.
Portanto, para isso, precisaremos de um novo método de volta à nossa classe de IA e vamos chamá-lo
de PickDestination e dizeremos que queremos que ele chegue aos nossos pontos extremos que configuramos.
Portanto, começaremos com -100 e este é um
exemplo de como você pode passar argumentos do script da Árvore de Comportamento para seus
métodos.
Então, quando você os declara, eles podem ser 'int's que você está enviando, eles podem
ser' bool's, eles podem ser 'float's.
Vamos fazer esses carros alegóricos, na verdade, eu vou colocar '. 0 'no final, porque eles são locais no espaço
e, depois disso, podemos reutilizar o MoveToDestination porque o MoveToDestination está apenas monitorando o nosso bot se movendo
em direção a um destino.
Se você não tivesse isso e tivesse apenas PickDestination, PickDestination, PickDestination,
PickDestination, ele falharia em se mover em qualquer lugar porque, antes que tivesse a chance de se mover, obteria
um novo destino definido no Nav Mesh Agent. É o MoveToDestination aqui que monitora o que o Nav Mesh
Agent está fazendo em segundo plano, dando a você tempo para ir de um local para outro.
Agora haverá 4 (copiarei e coloco aqui) porque temos 4 cantos diferentes que
queremos ir.
Então, vamos começar em -100, -100 e
depois vamos para -100, 100 e depois vamos para 100, 100 e depois vamos para 100, -100 assim.
Então salve isso.
Então você quer voltar para a Unity.
Você deseja selecionar o Droid e alterar sua Árvore de Comportamento
para patrulha, então arraste e solte Patrulha. Entre na sua Árvore de Comportamento e você verá aqui a nova que está surgindo.
Agora, se você esperar um pouco, receberá uma mensagem de erro que será exibida e elas ficarão vermelhas se não
existirem como um método na sua classe de IA. Eu já escrevi o meu, então ele encontrou e está bem.
Mesmo se você tiver um erro de ortografia nos nomes dos
seus métodos, ele
será exibido e verifique se você verificou se é o mesmo nos dois lugares.
O mesmo vale para seus parâmetros.
Estamos enviando através de carros alegóricos.
Deve estar esperando por um carro alegórico dentro da classe de IA.
Portanto, na sua aula de IA (porque você provavelmente está vendo erros no momento,
vamos
abri-lo e dar uma olhada, aqui está, aqui) acima de PickRandomDestination.
Eu criei um novo método chamado PickDestination com um valor X e Z para o nosso mapa e,
em seguida, estamos usando 'dest' como um novo vetor que está em X e Z, em vez de ser um
valor aleatório.
Y é definido como
0 porque nosso plano de terra está sentado em 0.
Se o seu plano básico não for 0, convém
ajustar isso e executar o SetDestination e retornar com um sucesso e é tudo o que
precisamos fazer para patrulhar agora, porque o código do MoveToDestination já está fazendo
o que precisamos. Faz.
Então adicione isso, salve-o e depois voltemos ao Unity e pressione Play e veremos o Droid em ação.
Se você clicar no Droid na Hierarquia, poderá assistir a cada um desses nós de folhas sendo executados enquanto
o Droid percorre o caminho. Portanto, o MoveToDestination está em execução no momento.
Vai passar rapidamente para PickDestination (ou foi o que foi feito) até o próximo MoveToDestination,
quando atingir cada waypoint que você está configurando através do código para acessar e, porque essa 'Repetir raiz' está marcada na
parte superior, vai dar voltas e voltas e voltas e voltas nessa sequência, que é o que você deseja
que ela faça.
Portanto, com tudo isso funcionando bem, vamos forçar a ocorrência de um erro para que você possa ver o que acontece.
Então, vamos ao script da IA e estamos procurando por PickDestination.
Portanto, o PickDestination tem no final uma tarefa. atual. Succeed (); '.
Esta NÃO é uma declaração de retorno, portanto, não o tira deste método e você pode chamá-lo de
qualquer lugar dentro do código. Ele apenas enviará um Sucesso de volta à Árvore de Comportamentos.
Assim, você pode realmente deixar de fora
e não receberá um erro, e é isso que vamos fazer. Vamos apenas comentar e salvá-lo, e depois voltaremos
ao Unity e pressionar Play.
Agora vamos dar uma olhada no que estamos chegando aqui.
Você pode ver que o PickDestination foi executado.
Vê que é azul?
Não terminou de executar.
É verde quando termina a corrida.
Agora você provavelmente está se perguntando "Bem, o bot ainda está se movendo, ainda está se movendo para o destino. "e ele será movido para o
destino porque o código do Nav Mesh Agent é o que o leva adiante.
Depois que vamos agente. SetDestination ', o agente vai fazer isso.
É o MoveToDestination que está sentado monitorando, esperando que ele chegue aonde
deve ir, para que ele possa escolher
o PRÓXIMO destino, mas você pode ver agora que concluiu que 1 caminho encontrado até
aqui está parado. Toda a Árvore de Comportamentos parou completamente.
Para que Succeed seja absolutamente necessário, e se você achar que suas Árvores de Comportamento estão apenas parando, você
esqueceu de colocar um Succeed or Fail.
Agora você também pode colocar um Fail aqui
e, como está repetindo, ele irá girar, girar, girar e constantemente falhar, de modo que ele
se moverá pelas seqüências até atingir um Fail e dispará-lo para fora e podemos realmente forçar isso
a acontecer e dar uma olhada.
Então, voltemos ao código e
colocarei Succeed de
volta para que possamos descer,
mas o que eu quero fazer é ter esse aqui, o PickRandomDestination.
Vamos definir isso como Fail. Então, para o Panda, é assim, então isso retornará uma 'falha' quando tentarmos fazer
um PickRandomDestination.
Vamos entrar em
nossa patrulha e, como a segunda configuração de destino, nos livraremos dos parâmetros e colocaremos isso como PickRandomDestination como
fizemos antes, quando estávamos vagando. Então salve isso e
vamos voltar aqui,
pressione Play e vamos assistir a árvore. Então o PickDestination agora foi bem-sucedido (é verde) e estamos
nos mudando para o nosso destino, então isso continuará passando até o bot subir no canto;
nesse momento, ele tentará executar esse PickRandomDestination que sabemos que vai falhou.
Então está
chegando à esquina, parou e aí, você pode ver que está vagando tentando se
virar porque esse é o 'agente. SetDestination 'é constantemente chamado, neste PickDestination e, em seguida, tenta passar para
ele e escolhe o mesmo destino para o qual já fomos.
Então, quando tentamos fazer um MoveDestination, já estamos lá.
Em seguida, fazemos um PickDestination que
falha imediatamente e, como estamos percorrendo essa rota, ele fica preso.
Você pode ver que está travado e os valores de Sucesso e Falha passando rapidamente para lá em cima e, como é vermelho, você
sabe que é onde há um ponto de falha em sua árvore e você pode querer um ponto de falha
em sua árvore, se é isso que a sequência vai fazer. Se uma determinada condição NÃO
for atendida na sequência, não será necessário continuar com a sequência.
Então, vamos tirar isso de lá e voltar e reparar nosso código.
Então, aqui, pressionarei Ctrl-Z para recuperar o que tinha antes e voltar ao meu script de IA. Vou definir
meu destino aleatório de volta para Succeed ... Curtiu isso.
Vamos agora considerar uma sequência de ataque.
Então, nesta sequência, eu vou ter 3 comportamentos diferentes.
Queremos que o próprio bot seja capaz de se voltar para um destino específico, e não para esse destino.
Então, isso envolverá definir o ponto que queremos observar e, na verdade, fazer
a curva e, depois que isso acontecer, poderemos executar uma ação de disparo / Ok, então a Árvore de
Comportamento para isso, chame de 'Ataque. BT 'e aí você quer algo parecido com isso.
Então,
temos nossa 'Root', nossa 'sequência', 'TargetPlayer', 'LookAtTarget' e depois 'Fire'.
Agora, isso significa que cada um deles precisa ser um método em nossa classe de IA. Para cada um dos nós da folha na
nova árvore de ataque, é preciso haver um método correspondente.
Primeiro de tudo, eu tenho o 'TargetPlayer'.
Tudo o que está fazendo é definir um Vector3 que é declarado no topo do nosso programa para a posição do jogador.
É tudo o que está fazendo, portanto, basta definir o valor de 'target'. Agora, fazê-lo dessa maneira significa que poderíamos
ter outros nós de folha que diriam 'olhar para árvore' ou 'olhar aleatoriamente' e ser capaz de definir esse
valor 'alvo' sem avançar em direção a ele.
Depois disso, eu tenho um 'LookAtTarget', então este é genérico, que mudará o bot e estará
voltado para onde quer que esse alvo seja definido.
Então, basta rolar um pouco e aumentar um pouco para que você possa ver a coisa toda.
Esse é praticamente o mesmo código que usamos antes (vou colocar isso na próxima
linha para você,
lá vamos nós) para direcionar algo e avançar em direção a ele,
mas, neste caso, estamos direcionando e virando em direção a. Então você verá aqui o familiar
Quaternion. Código Slerp que usamos
anteriormente e nosso cálculo do vetor de direção. Tão... direção... deslize em direção a ela.
Agora eu tenho um Debug. Entre aqui, do qual vou me livrar, porque não precisamos
dele e, em vez disso, há uma 'Tarefa. isInspected '. Essa linha aqui nos permitirá ver
o ângulo atual entre o bot e onde o nosso jogador está (neste caso, o alvo) na linha de depuração dentro
da Árvore de Comportamento, o que é fantástico, porque podemos realmente
ver esse valor mudando como o bot se vira e então estamos dizendo no final, se o ângulo estiver dentro de 5 graus, essa tarefa
foi bem-sucedida.
Então, vamos continuar girando, continuar girando, continuar girando e, em seguida, obteremos um 'sucesso'
nessa tarefa em particular, porque não houve uma falha e até que uma falha recebida
pela Árvore de Comportamento, ela ainda continue estar executando isso. Agora, depois de olharmos para o 'alvo', vamos disparar e o código de
disparo é bem familiar. Nesse caso, não
será o mesmo tipo de configuração que temos aqui, onde você tem um
vazio público e, em seguida, um retorno de Succeed.
O que você também pode fazer com esses métodos para esses nós folha é que eles retornem um valor 'true' ou 'false' para
que você possa verificar se eles ocorreram ou não e executar uma pequena lógica booleana na própria árvore de comportamento,
mesmo apesar
de não estarmos fazendo isso com isso, neste
caso, mas você verá isso acontecer
no futuro e, se não estiver, poderá configurá-lo da mesma maneira que os outros com o sucesso
devolvido. em vez de.
Agora, aqui, estamos apenas obtendo a pré-fabricação de balas e instanciando uma cópia dela no final do bulletSpawn. Novamente, o mesmo que fizemos na demonstração dos
tanques, muito antes no curso. Então, estamos adicionando uma força à
bala, apenas para impulsioná-la no ambiente mundial.
Certo, então, com essas coisas feitas, vamos salvá-lo. Salve seu script AI e seu ataque e volte para
o Unity.
Então, apenas seleciono o Droid, para que possamos ver sua Árvore de Comportamentos, coloque 'Attack. BT 'aqui como o script e, quando estiver
pronto, pressione Play e o Droid vira para o nosso droid, ok. No momento, não se preocupa com paredes nem nada, está apenas se voltando
(é o que dissemos para fazer)
para onde ele sabe que está o nosso jogador e, se eu o mover,
ele continuará girando e
atirando assim. ..
Agora não há explicação para a velocidade do disparo em nossa sequência atual.
Ele estará circulando rapidamente por toda a árvore, mirando constantemente no jogador, olhando para o
jogador e depois disparando.
Se você quiser adicionar uma 'espera' aqui, você pode fazer isso facilmente neste sistema da Árvore de Comportamentos.
Se voltarmos ao nosso script de ataque aqui, é que há 'esperas' embutidas nele,
para que possamos colocar 'Wait (0. 5) 'e esperará meio segundo antes de disparar e, em seguida,
retornará novamente e esperará meio segundo antes de disparar. Então, salve isso e volte para o Unity e pressione Play.
Agora você pode ver que haverá meio segundo entre cada cena
e assim adicionar atrasos agradáveis à própria Árvore de Comportamento.
Tudo certo.
Então, vamos deixar essa palestra aqui. Na próxima palestra, começaremos
a adicionar algumas condições e o bot deve realmente testar se consegue ver o jogador antes de
começar a filmar.
Então, faremos isso a seguir.