‫Olá e bem-vindo.
‫Nesta palestra, veremos algumas escolhas em nossas árvores de comportamento, de modo que eu possa fazer um inimigo
‫correr em minha direção e, se ele me perder de vista, ele chegará ao meu último local conhecido fazendo basicamente dois comportamentos
‫uma perseguição e, em seguida, Eu investigo o comportamento.
‫Vamos mergulhar e ver como isso é possível.
‫Usando árvores de comportamento.
‫Portanto, embora esse comportamento de patrulhamento seja muito instrutivo, não é realmente o tipo de comportamento que
‫queremos implementar.
‫O que preferimos ter é algo ao longo das seguintes linhas.
‫Quando podemos ver o jogador, vamos e nos aproximamos dele o máximo que podemos.
‫E quando o jogador sai de vista, tentamos nos mover para o último local conhecido do jogador para
‫encontrá-lo.
‫E uma vez que tenhamos esgotado essa opção, talvez voltemos para um local diferente, ou talvez
‫fiquemos lá por enquanto.
‫Então, como podemos conseguir isso?
‫Bem, no momento, não temos como conseguir isso com uma sequência de ações.
‫Precisamos fazer uma escolha com base nos dados que temos disponíveis.
‫Precisamos escolher se podemos ver o jogador ou não, se temos ou não a localização
‫do último jogador conhecido, esse tipo de coisa.
‫Então, para fazer isso, precisamos de um novo tipo de nó na árvore de comportamento chamado nota seletora.
‫Então, se clicarmos com o botão direito do mouse e olharmos para nossas composições, uma das opções é o seletor.
‫Agora, o seletor, em oposição à sequência, é executado dessa maneira.
‫Se você tiver várias tarefas abaixo do seletor, ele será executado até que a primeira seja bem-sucedida.
‫E basicamente é esperar que todos eles falhem até que um deles tenha sucesso.
‫Agora a sequência fez o oposto.
‫Ele executa todos eles até que um deles falhe.
‫Então, por que isso é útil?
‫Por que é útil que o seletor execute um deles até que um deles seja bem-sucedido?
‫Porque basicamente queremos que ele escolha a primeira opção viável.
‫Agora, a maneira como faremos isso não é executando tarefas sob o seletor, mas
‫executando sequências sob o seletor.
‫Então, no nível raiz, faremos uma nota de seletor.
‫E abaixo disso, vamos apenas mover essa sequência de lado e criar outras sequências.
‫Nós vamos ter uma sequência aqui.
‫E o que podemos fazer é renomear a sequência de ser sequência para algo como Chase.
‫E então podemos adicionar outra sequência aqui, que vai seguir as linhas de investigação.
‫E esses são basicamente nossos dois comportamentos que queremos poder escolher.
‫E para fazê-los falhar, podemos adicionar coisas aos nós chamados decoradores.
‫Então, se você clicar com o botão direito em um nó e adicionar decorador, você pode ver aqui que há várias opções aqui.
‫E eles basicamente mudam a maneira como esse nó funciona.
‫Então eles podem fazer isso de várias maneiras.
‫Por exemplo, temos esse loop condicional que permite que você faça um loop por todas as ações
‫novamente na sequência quantas vezes essa condicional estiver correta.
‫Temos outras coisas aqui, como uma verificação de código, que é sobre visibilidade e outras coisas lindas.
‫Temos apenas um loop puro.
‫Temos um limite de tempo.
‫Então, só podemos ficar dentro dessa sequência por um certo período de tempo.
‫Basicamente muitas coisas que modificam o comportamento desta sequência.
‫Mas o que nos interessa é o quadro-negro, porque esta é uma condição de quadro-negro.
‫E como você pode ver a partir da escrita abaixo dele, o padrão é algo ao longo das linhas
‫de este auto ato definido?
‫E se isso não estiver definido, automaticamente esse nó e tudo abaixo dele falharão, o que significa que
‫nosso seletor passará para a opção dois, que é investigar.
‫Então, neste caso, nós realmente queremos mudar isso.
‫Queremos mudar a forma como isso funciona.
‫Portanto, nossa localização do player, queremos que seja definida apenas quando o player estiver visível.
‫E então queremos adicionar uma nova variável aqui novamente, um vetor que será o último local conhecido do jogador e
‫o último local conhecido do jogador quando o jogador estiver visível será o mesmo.
‫Mas uma vez que o jogador se torna invisível, a localização do jogador fica indefinida.
‫E o último local conhecido do jogador é onde queremos ir.
‫Então, podemos fazer isso indo para nossa condição Blackboard Base e apenas alterando-a para que
‫a consulta seja Sim.
‫Mas o que queremos que seja definido é a localização do jogador.
‫Então, se o local de jogo está definido, então vamos perseguir e vamos dar Chase fazendo
‫basicamente apenas um movimento para e vamos nos mover para o local do jogador.
‫Então agora não estamos fazendo muito mais na sequência.
‫Então, na verdade, você também pode colocar essa condição de quadro-negro diretamente em movimento.
‫Mas porque podemos querer fazer outras coisas, como filmar, vou deixar como uma sequência por
‫enquanto.
‫Então temos esta investigação.
‫Investigate basicamente também fará um movimento, mas ele se moverá para em vez de se mover para
‫o local do jogador, ele se moverá para o último local conhecido do jogador.
‫E você pode ver que não temos uma condição para isso, porque isso falha se essa condição falhar.
‫Uma coisa importante a ser observada sobre essas condições do quadro-negro é que, por padrão, uma vez que
‫tomamos a decisão de começar a executar este nó, não vamos reavaliar isso.
‫Então, se por algum motivo perdermos o jogador de vista enquanto estamos nos movendo para a localização desse
‫jogador, continuaremos tentando chegar lá.
‫Então, se quisermos abortar a execução desta nota, há uma opção para isso.
‫Se você for para o controle de fluxo, há observadores de notificação e há abaixo dele.
‫O observador aborta no momento definido como nenhum.
‫Mas você pode selecionar entre algumas opções.
‫Você pode configurá-lo para si mesmo.
‫Então, isso está dizendo que se essa condição de repente se tornar falsa, pare o que estiver fazendo e
‫reavalie seu seletor e veja.
‫Talvez agora precisemos fazer a nota de investigação.
‫A outra opção aqui é de menor prioridade e você pode ver que mudou o que está destacado aqui.
‫Está dizendo que se de repente essa condição do quadro-negro se tornar verdadeira, pare tudo o que estávamos fazendo e
‫comece a executar essa condição de perseguição.
‫E então a opção final é ambos.
‫E este é o que queremos.
‫Basicamente, está dizendo que essa condição baseada no quadro-negro, se se tornar verdadeira, começamos a executar
‫a sequência imediatamente.
‫Se se tornar falso, paramos de executá-lo imediatamente ou paramos de executar o que mais estava acontecendo.
‫Basicamente, queremos sempre ir e fazer qualquer caminho que seja ditado por essa condição de quadro-negro.
‫Portanto, espero que faça sentido que os relatórios do observador parem as coisas em ação, caso contrário, ele
‫aguardará até que a ação seja concluída antes de reavaliar.
‫Então, realmente, agora queremos ir em frente e implementar nosso último local conhecido e local de reprodução porque, no momento, se formos
‫para o nosso C++ e nos dermos um pouco mais de espaço, você poderá ver que estamos apenas
‫configurando isso local de jogo em Begin Play.
‫Idealmente, faríamos isso toda vez que tivéssemos uma linha de visão para nosso grupo de jogadores, e assim podemos realmente
‫descomentar nosso código de linha de visão aqui.
‫E provavelmente queremos descomentar o código else também.
‫Mas neste caso não vamos limpar o foco e parar o movimento diretamente.
‫Eu posso ir em frente e removê-los inteiramente porque.
‫Não é assim que estamos fazendo as coisas no momento.
‫Em vez disso, o que queremos fazer, se eu remover o código, é estar aqui definindo a localização do
‫jogador.
‫Também queremos definir o último local conhecido lá.
‫E de outra forma queremos limpar a localização do jogador.
‫Agora, para fazer isso, temos uma função disponível para nós, que é em vez do valor definido como
‫vetor, se formos em frente e abrirmos nosso componente do quadro-negro dot h, há um valor claro.
‫E isso apenas leva o nome f não precisa ter um tipo ou qualquer coisa ou porque estamos
‫apenas apagando completamente o que estava nessa variável.
‫Então aqui eu tenho um desafio para você preencher o nosso carrapato.
‫Defina as duas variáveis quando estiver na linha de visão.
‫Basicamente, preencha este primeiro bit da instrução F e, em seguida, limpe a localização do player quando tivermos o
‫else.
‫Então, quando perdemos a linha de visão, não temos mais um local de jogo.
‫Reduza a velocidade do inimigo que está no mundo para que você possa fugir dele mais facilmente.
‫E então verifique a funcionalidade, verifique se você consegue se esconder atrás de uma esquina e se ele vai até o
‫último local conhecido para tentar te encontrar.
‫Pause o vídeo e experimente.
‫OK.
‫Bem vindo de volta.
‫Então vamos dar uma chance a isso.
‫Em primeiro lugar, estamos definindo o local de jogo.
‫Vou tirá-lo do início do jogo e movê-lo aqui.
‫Então, para definir a localização do jogador, precisamos colocar o jogador aqui e tomar novamente.
‫Então eu vou descomentar essa linha.
‫E então estamos fazendo exatamente a mesma coisa, exatamente a mesma linha de código para o nosso último local conhecido do
‫jogador aqui.
‫Então, vamos para o nosso quadro-negro e certifique-se de copiá-lo para obter exatamente o mesmo nome e, em seguida,
‫queremos apenas esclarecer que a última coisa é limpar a localização do nosso jogador aqui.
‫Portanto, será um valor claro e usará a localização do player de texto como o valor que
‫estamos tentando limpar no final.
‫E podemos ir em frente e compilar e ver se isso funciona.
‫Enquanto Compile foi bem sucedido.
‫A outra coisa que eu disse para fazer a depuração mais fácil foi selecionar o inimigo
‫e podemos ir e mudar sua velocidade descendo para seus componentes de movimento e encontrando a caminhada e encontrando sua velocidade.
‫Então a velocidade máxima de caminhada é 600 aqui.
‫Vamos definir para 400 para que possamos facilmente fugir deles.
‫Eles vão andar um pouco devagar e vão jogar.
‫Eles estão caminhando em direção a um lentamente.
‫Podemos fugir.
‫Escondemo-nos atrás de uma esquina e lá vão eles.
‫Venha nos procurar cada vez.
‫Mas espero que se nos escondermos atrás de duas curvas, eles não serão capazes de nos encontrar.
‫Então eu escondo lá, escondo aqui, escondo aqui.
‫E ele vai investigar o último local conhecido, você vê, ele acabou de enfiar a
‫cabeça na esquina, mas então ele está preso lá porque ele não sabe o que fazer.
‫E se fôssemos dar uma olhada em nossa árvore de comportamento e simplesmente colocássemos isso de um lado e o jogo para
‫o outro e me desse um pouco de espaço.
‫Então, se dermos uma olhada na árvore de comportamento, podemos ver que está meio agitado por aqui
‫porque não pode fazer nenhum deles.
‫Ele está tentando se mover para o último local conhecido que está dando certo.
‫Então está ficando meio travado aqui.
‫Mas se eu aparecer, você pode ver que ele está se movendo em minha direção.
‫Se ele me perder de vista, ele passa para a condição de investigador.
‫Então perca a visão.
‫Ele vai investigar.
‫E então ele vem e me vê e depois volta a me perseguir.
‫Portanto, esse comportamento está realmente funcionando.
‫Agora podemos escolher entre tentar perseguir e tentar investigar com base nesse comportamento do quadro-negro.
‫Vamos apenas mudar o nome deste quadro-negro para comportamento aqui para ver jogar um ponto de interrogação.
‫Então vai ser muito mais fácil de ler.
‫Agora que temos esse seletor, podemos ver o jogo, então devemos persegui-lo, caso contrário, devemos
‫investigar e podemos excluir essa sequência aqui porque ela não está mais em uso.
‫Então, espero que agora você tenha uma compreensão melhor de como as árvores de comportamento podem
‫ser vinculadas para criar escolha e sequência e colocar muitas tarefas juntas para tornar comportamentos mais complexos com muita facilidade.
‫Na próxima palestra, veremos como podemos criar nossas próprias tarefas personalizadas em C++ para que possamos
‫obter alguma ação de tiro.
‫Vejo vocês no próximo vídeo.