Bem-vindo de volta à Parte 3 da série sobre a criação de uma Máquina de Estado Finito para um
NPC e o que faremos agora é adicionar ao nosso estado final, que será 'Ataque'.
Então, para começar, primeiro precisamos configurar nosso NPC para fazer isso e ele precisará de marcadores.
Vou ao
tanque (vamos encontrá-lo em
cena) e queremos atirar no tanque. No tanque que você recebeu (se você baixou
o meu projeto) no final da torre, se eu puder encontrá-lo ...
vamos deixar isso pra lá ...
você verá que tenho um pequeno cubo ali.
Então eu adicionei um cubo e eu girei e anexei ao tanque na posição em que eu quero que
as balas venham.
Agora você deve certificar-se de que também desativa o Box Collider se estiver
fazendo
isso em um modelo diferente, mas o importante é que esta caixa esteja anexada ao seu NPC, para que, quando o NPC se
mover, essa caixa funcione também porque é a posição relativa das balas.
Então, está tudo pronto para ir para lá.
Vamos voltar ao Animator
e, aqui, vamos adicionar nosso script de ataque.
Então, clique com o botão direito do mouse em> Criar Estado> Vazio e chamaremos isso de 'Ataque' e, para o nosso estado de ataque, adicionaremos o
comportamento do Ataque e o código para o nosso Ataque se parece
com isso.
Então, eu vou substituir o código comentado pelo novo código.
Novamente, o Attack assumirá a liderança de nossa classe NPCBaseFSM que criamos, para que ele receba os
dados do NPC, e então começamos a obter as informações sobre o oponente e o NPC e a velocidade
e tudo isso (embora não seja necessário
em neste caso em particular) e vamos chamar alguns métodos que estão dentro do
TankAI deste.
Então, estamos ligando
de volta para o outro lado desta vez e
agora temos nosso TankAI StartFiring quando entramos no estado de ataque e depois na atualização, continuaremos olhando para o oponente.
Estou apenas usando uma transformação muito fácil. LookAt e, em
seguida, a posição do oponente. Você pode colocar slerping e outras coisas aqui se
quiser que pareça um
pouco mais suave, mas para nossos propósitos, isso funciona muito bem.
Então, quando sairmos, executaremos um método TankAI chamado StopFiring. O StartFiring (como você verá em um minuto)
é um InvokeRepeating, portanto, ele
começará a ser disparado o tempo todo enquanto estiver no estado de ataque
e, logo antes de sair do estado
de ataque, será solicitado a interromper o disparo. método invocado.
No script TankAI, adicionaremos esses métodos que o estado está chamando. Então, logo abaixo
do GetPlayer, adicionarei essas três
coisas.
O método que faz todo o trabalho é este 'Fire' e instancia um
objeto de bala de uma pré-fabricada (que definiremos em um momento) a partir da posição da torre e esse
é o pequeno cubo que criamos antes
e a torre rotação. Portanto, garantirá que ele empurre a bala na mesma direção em que a rotação da torre está definida e faça isso usando um corpo rígido GetComponent na bala e, em seguida, um AddForce da direção para frente das torres multiplicado por 500 nesse caso .
Então essa é a força
da força em
que a bala está saindo. Agora, os 2 métodos públicos aqui
(para iniciar e parar de disparar) são os chamados de volta no script Attack.
O StopFiring apenas cancelará a
chamada em 'Fire', que acontece quando o StartFiring é chamado.
Portanto, o InvokeRepeating iniciará o método 'Fire' (que é o que está aqui em cima) após
meio segundo e, em seguida, continuará chamando a cada meio segundo depois disso.
Agora você pode tornar isso mais rápido, diminuindo esse valor aqui
ou pode ter um intervalo maior também. Agora, a própria bala precisa entrar no TankAI, para que possamos criar uma variável pública exposta no topo para isso ...
largá-lo.
O objeto do jogo também precisa saber sobre sua torre, então colocaremos GameObject, porque é isso que estamos usando para configurar
o alinhamento da própria bala. Portanto, com os dois públicos,
podemos salvar todo esse código, voltar para a Unity, encontrar nosso tanque (que fica no topo aqui) e
você verá que tem uma bala e a torre. Agora a torre que você tem que pegar do cubo que está preso ao tanque, então nós a agarramos e a arrastamos até lá e depois a bala ...
você encontrará o marcador nos recursos do projeto
que eu lhe dei.
Agora, este é o mesmo marcador que está no projeto do tanque que
o Unity possui, mas adicionei um script extra a ele, então basta arrastá-lo e soltá-lo
no local do marcador.
Se você der uma olhada rápida na bala e na parte inferior, há um pequeno script de bala aqui e o que ela faz é instanciar uma explosão quando a bala atinge algo e depois faz com que a bala desapareça essencialmente.
Direita. Então, isso já está programado para você no
arquivo de recurso. Ok, agora precisamos configurar
o ataque para que o ataque aconteça. Se estivermos no modo perseguição, digamos que queremos
fazer a transição para o ataque. Faça uma transição para o Attack, quando estivermos ... digamos uma distância menor que ...
10) Portanto, temos uma 'distância de perseguição' de 20 e agora teremos uma 'distância de ataque' menor que 10.
Agora, se for maior que 10, voltaremos à perseguição.
Então, faça Transição de volta para
o outro
lado, selecione essa transição e adicionaremos a condição de 'distância maior que 10'.
Portanto, se sairmos agora de um intervalo de 10, ele voltará ao normal.
Portanto, 'menor que' para atacar e 'maior que' para voltar ao modo Chase.
Vamos dar uma olhada no comportamento do nosso tanque agora.
Então, estamos patrulhando ... a própria patrulha nos aproxima o suficiente para desencadear a perseguição, então ela começa
a nos perseguir.
Quando estiver perto o suficiente, ele irá parar e
começar a disparar, como você pode ver lá. Agora, ele não se move em nossa direção, porque esse comportamento de ataque não
possui nenhum código de movimento.
Ele só muda o código, por isso, se eu apenas me mover, continuará tentando disparar em minha direção.
Agora, se eu ficar longe o suficiente, ele voltará para Chase
e continuará me perseguindo; se eu estiver longe o suficiente, esquecerá completamente de mim e voltará para a Patrulha.
Agora, o que não tenho aqui é uma transição que vai do
Ataque de volta à Patrulha ou de outra maneira, porque essa lógica dispara diretamente através desses estados,
dependendo de quão perto você esteja. Se eu subitamente chegasse a 10, ele passaria pelo estado de Chase para o
Attack e eu nem teria tempo para executar nada no Chase.
Então está bem.
Eu não preciso de um extra aqui, embora
você possa colocar um lá,
se quiser, mas neste caso, não é absolutamente necessário.
Obviamente, agora está me atacando fora da tela, porque o ponto de referência levou-me a fechar o suficiente
para o meu tanque e você pode ver isso aqui na cena, o que é muito divertido.
Ok, então se eu simplesmente me mover novamente e sair da
estrada, ele deve esquecer de mim e será redefinido.
Ele está entrando na patrulha e volta ao waypoint 1 e continua em sua pequena rota.
Tudo bem, isto é, máquinas de estado finito
em poucas palavras e como empregar as máquinas de estado que estão dentro do sistema mecanim para
fazer isso.
Agora você pode ver como é fácil e lógico a Máquina de Estado Finito e
o que faz com a maneira antiga de fazê-lo. Há muitas declarações if deixadas de
distância e coisas assim, que você normalmente teria programar em seu
MonoBehaviour para alterar o estado do seu personagem, enquanto
isso o fará automaticamente em scripts separados que você pode usar em outros personagens e, é
claro, definir diferentes tipos de comportamento para esses personagens, mesmo que sejam no mesmo estado.