Se você trabalhou com animação de personagens ou comportamentos de personagens não jogadores em um jogo, é provável
que você tenha implementado estados em algum momento, ou outros estados permitam que os objetos do jogo assumam comportamentos diferentes
quando necessário, fazendo parecer que eles são controlados por uma classe completamente diferente.
A unidade faz uso dos estados no sistema de mecanismo.
No animador, você pode criar um gráfico simples de estados a partir de animações individuais e definir
como ir de um estado para o outro.
Máquinas de estado finito usadas em jogos são a encarnação deste padrão de design.
Uma máquina de estado finito é uma máquina conceitual que pode estar em exatamente um de qualquer número de estados
finitos, a qualquer momento.
Uma máquina de estado finito é usada no campo da inteligência artificial para definir, entre outras coisas, os comportamentos
dos personagens controlados por computador.
Ele é representado como um gráfico com nós que representam os estados e transições que definem o caminho
de um nó para o próximo.
Uma vez que um estado tenha sido inserido, o NPC permanece nesse estado até que uma condição sobre a transição seja cumprida.
Aqui temos uma máquina de estado finito para um simples comportamento de guarda.
Se o NPC estiver no estado de patrulha, ele continuará executando os comportamentos associados até que uma condição
seja cumprida em qualquer uma das transições de saída do estado.
Neste caso, ele está esperando até que o jogador esteja a uma distância inferior a 20 km.
Uma vez satisfeita essa condição, o NPC transita para o estado de perseguição.
Qualquer estado em uma máquina de estado tem três processos que ela funciona em momentos diferentes.
Tem uma entrada, tem uma atualização e tem uma saída.
A entrada é feita assim que o estado é transferido para o estado e, em seguida, entra no loop infinito da atualização.
A atualização continua a ser feita até que a transição para fora do estado seja acionada.
Neste ponto, antes de deixar o estado, o método de saída é executado.
Por exemplo, um NPC que está fazendo a transição para o estado de patrulha ao entrar precisará definir a animação apropriada,
bem como determinar onde estão os pontos de passagem para a patrulha.
Durante sua atualização, o NPC simplesmente andará de um ponto de passagem para outro, verificando constantemente quando
um ponto de passagem tiver sido alcançado e depois procurando o próximo.
Algo na atualização deve fazer com que a saída dispare.
Isto poderia ser algo tão simples quanto o NPC decidir dormir.
A animação da caminhada é interrompida e a transição dos NPCs para o próximo estado que cuida do novo
comportamento do sono começará.
Uma máquina de estado pode ser tão fácil de implementar quanto uma declaração.
Por exemplo, digamos que você tenha um NPC que você queira estar em um dos dois estados, ocioso ou andando.
Isso seria fácil de lidar em um loop de atualização, e você provavelmente já fez isso você mesmo antes.
Na verdade, o código que você vê aqui é muito verboso para o que você realmente quer fazer em uma tarefa tão
simples.
Mas ela é desmontada para ilustrar como funcionam os estados.
Portanto, antes de tudo, você tem uma bandeira do estado que registra o estado em que o NPC está.
Agora, neste caso, eu usei um fio, mas você poderia facilmente ter um número inteiro ou mesmo usar um enumero que o
tornaria mais significativo.
Agora você poderia usar uma tecla para indicar se quer andar ou se quer ficar ocioso, o que então colocaria
aquela bandeira de estado.
Mais tarde, no ciclo de atualização.
Nós testamos para o estado.
Assim como o estado está mudando, se ele quer que sua NBC esteja andando, então ele vai tocar uma
animação ambulante e traduzir o personagem em uma direção adiante.
Enquanto que se for ocioso o estado, então você quer tocar a animação ociosa e não quer mover
o personagem.
Se, no entanto, o código fora desta classe for capaz de definir o estado como morto, as teclas pressionadas dentro da atualização sobregravariam
isso e você teria que lidar com isso através de um pouco de refatoração que poderia parecer com isto.
Observe como estamos testando se o estado está morto dentro da atualização antes de fazer qualquer outra coisa.
Ok, então isto não é muito confuso, mas quando você começa a adicionar muitos outros estados de caráter
e os tem misturados, montar uma máquina de estado neste formato fica muito mais complicado.
Portanto, o padrão estatal entra em jogo onde um estado é definido como uma peça de código contida que lida
com todos os comportamentos e somente os comportamentos que pertencem a esse estado particular.
Em vez disso, vamos escrever nossa própria classe baseada no estado que todos os outros estados herdarão de um
registro estatal o tipo de estado que é, o que dependerá inteiramente do tipo de máquina estatal que você está
escrevendo.
Neste caso, será usada para construir uma máquina estatal para um guarda NPC que patrulhará uma área e perseguirá um
ataque que se aproxima dos jogadores.
Lembra-se das três fases de um estado?
Bem, eles entram, atualizam e saem.
A fase ditará o método a ser seguido.
Você pode ver que existem métodos para cada uma das etapas e os métodos de base atualizam as etapas de acordo.
Por último, mas não menos importante, existe um método de processo.
Isto é chamado de fora de qualquer estado e determina qual método dentro do estado deve ser executado
a qualquer momento com base no cenário.
Através do uso desta classe base como modelo para todos os estados, podemos ter a certeza de manter o código relacionado
a cada estado compartimentado com outros comportamentos NPC.
É realmente um padrão de design bastante inteligente.
Pronto, já chega de teoria.
Vamos começar a construir esta coisa quando você conseguir algum código e começar a criar mais.
Mais estados herdando dessa classe base.
Você verá como este método de design é poderoso e como tornará sua vida criando comportamentos de IA em seus personagens muito mais simples do que
ter que fazer malabarismos com o estado em que eles estão e qual animação está tocando e qual animação não está tocando,
o que importa a imprensa e todo este tipo de coisas, porque eles podem ficar
muito, muito confusos muito, muito rapidamente.
Certo?
Portanto, abra um novo projeto de unidade.
Agora quero que você traga o arquivo inicial que está anexado a esta palestra como um recurso.
Basta estar ciente de que quando você trouxer aquele pacote de unidade pela primeira vez, a unidade
vai querer se reiniciar, e isso porque o controlador tem o novo sistema de entrada nele.
Portanto, basta deixá-lo reiniciar-se para que traga os pacotes corretos.
E então, uma vez que você tenha feito isso, você poderá receber alguns erros que surgem no console.
Talvez não, mas se o fizer, assim como ignorá-los, está bem?
Ou apenas limpá-los, eles não lhe causarão nenhum problema futuro porque a maioria dos bens padrão que
estão aqui dos velhos bens padrão, isso causa alguns problemas porque o código foi depreciado.
Na verdade, já tirei isso, mas não posso prometer que não tenha perdido nada.
Eu mesmo acabei de trazer isto e não estou cometendo nenhum erro, portanto, fique atento a isso.
Desde que não sejam erros de leitura, você está bem encaminhado.
Agora também tenho a guia de navegação aqui em cima, e se você abriu meu projeto, acredito que você obterá
isso também.
Se você não for apenas à janela e eu navego para abrir a navegação, vá para a aba de trás e depois basta clicar
em Bake.
Agora isso irá assar novamente a superfície da malha de navegação mostrando-lhe as áreas que podem ser percorridas em azul.
E você pode ver aqui que a estrutura está excluída e a área ao redor das árvores também.
Agora, ug, quem é o nosso Deus?
Vamos nos aproximar um pouco mais dele.
Ampliar aqui.
Lá está ele.
Certo, então ele está vigiando nossa estrutura.
Ele vai fazer a patrulha e tem um componente de agente de navegação ligado a ele, que fará todo o trabalho para
nós.
Para ele se movendo.
Ele tem uma fonte de áudio para o tiroteio e seu animador está pronto para você se tivermos uma rápida olhada
nesse animador.
Portanto, vamos apenas clicar duas vezes no animador UG e abrir isto.
Pressione F para centralizá-la.
Você verá que há um ídolo, então há um ídolo de fuzil.
Há também aqui em cima, um passeio de fuzil, um tiro de fuzil e um tiro de fuzil.
E há algumas outras coisas aqui em baixo que chegarão um pouco mais tarde.
Isto em si é uma máquina de estado porque são estados de animação, e estas são as transições que
desencadeiam entre eles.
Mas não estamos escrevendo isto.
Portanto, esta é apenas a animação, mas você verá se clicar em qualquer uma das transições.
Portanto, para passar de Rifle Idol a rifle walk, então você tem que acionar a condição de andar e nós faremos isso tudo no código
para que você não tenha que configurar isso.
Está lá pronto para ir por você, mas não há código atualmente na UG.
A primeira coisa que vamos fazer é escrever uma aula de um só botão para o ambiente do jogo porque, como
nossos projetos anteriores que criamos, há alguns pontos de verificação estabelecidos na superfície
e você os verá na cena se formos até aqui.
E se eu clicar em todos eles, são cinco no total e lá estão eles.
Assim, eles nos dão um circuito para dar a volta.
Cada ponto de controle tem uma etiqueta de ponto de controle com um C maiúsculo.
Certo.
Bem, isso é praticamente todo o conjunto deste ambiente, que ocupou um vídeo inteiro para se acostumar.
Portanto, investigue isto um pouco mais se você quiser ver como tudo está montado com o animador e todo esse
tipo de coisas.
Quando voltarmos no próximo vídeo, começaremos realmente a programar nossa máquina de estado finito.