Criação das mecânicas do Titanium Sentinela, Parte 1

Finalmente, voltamos à programação! Neste sábado, me concentrei em construir as mecânicas do Titanium Sentinela e dessa vez, tenho muito código-fonte para lhes mostrar (e como vocês podem ver pelo título, terei mais ainda, já que a parte mecânica do Sentinela não está - neste momento - finalizada). Vamos então começar do ínicio, com os dois blocos de código (aqui chamados de "funções") mais fundamentais do Unity: Start e Update.

Para quem não sabe, Start e Update são duas funções próprias do Unity. Sempre que você criar um novo script dentro do editor do Unity e abrí-lo, se deparará com essas funções. Start é utilizada apenas uma vez, para comandos a serem executados no instante em que o objeto (neste caso, o Sentinela) surgir no jogo, enquanto Update é utilizada repetidamente, para comandos que devem ser executados a todo instante a partir do momento em que objeto surge no jogo.

Eu poderia fazer uma longa explicação textual detalhando o funcionamento que Start e Update têm exclusivamente para o Titanium Sentinela; todavia, apliquei no código-fonte uma boa prática conhecida por muitos programadores: o uso de comentários, que são as linhas verdes iniciadas por "//" que explicarão a porção de código da seguinte imagem:



Funções Start e Update do Titanium Sentinela.



Agora que já combrimos tudo sobre estas duas funções padrão do Unity, vamos abordar as funções contidas dentro delas: Init, CanSeePlayer, Combat e Movement.
Diferente de Start e Update, essas quatro funções não são próprias do Unity; são funções criadas do zero para suprir necessidades específicas do programador que vos fala. 

Comecemos pela Init, que é a única função chamada dentro da Start. Assim como a Start, a Init consiste apenas de comandos de inicialização, ou seja, dependendo da situação, a sua existência pode não ser necessária. Contudo, tanto o Titanium Sentinela quanto o Titanium Drone herdam características comuns de uma classe genérica chamada Enemy, que por sua vez, divide atributos com a classe Player a partir de um classe mais genérica chamada Character.
Acontece que cada classe possui seus próprios comandos de inicialização e adivinhem só: as funções padrão do Unity não suportam herança, então a melhor solução seria:
  1. Criar uma função do zero na classe pai;
  2. Sobrescrever esta função na classe filho, adicionando os comandos da classe pai;
  3. Executar esta função na Start da classe filho.



Variáveis globais do Titanium Sentinela seguidas de sua função Init, que as instancia.



Agora, quanto às funções executadas pela Update, começaremos pela CanSeePlayer. Bem como o nome diz, ela é uma função dedicada especificamente para verificar se o inimigo é ou não capaz de enxergar o jogador naquele instante. Possui um retorno do tipo booleano, ou seja, deve retornar um valor falso ou verdadeiro e a função Combat depende diretamente desse retorno para ser chamada.



Função CanSeePlayer do Titanium Sentinela.



Já que mencionamos a Combat, vamos abordá-la agora. À primeira vista a função parece é bem simples, se dedicando apenas a determinar se o inimigo está de frente com o jogador e fazê-lo atirar caso esteja.



Função Combat do Titanium Sentinela.



Porém, essa função está conectada de maneira indireta a outra função chamada Shoot. Vêem aquele "anim.SetBool" ali em cima? Aquilo é o gerenciador de animação (mais conhecido como Animator) do inimigo sendo chamado. O Animator é um componente de um objeto que contém todas as suas animações, assim como os parâmetros necessários para realizar a troca entre essas animações.



Animator do Titanium Sentinela.



Conseguem ver o parâmetro "shoot" na imagem? Ele é ativado a partir do "anim.setBool" da função Combat e dá início à animação de tiro do Sentinela, Sentinel Shoot. Mas não é só isso; a animação de tiro do Sentinela possui em um de seus frames algo conhecido Animation Event, ou evento de animação, que nada mais é do que um gatilho capaz de chamar uma função de uma classe, desde ambas sejam públicas.






E como vocês podem ver, esse evento chama nada mais nada menos que a função Shoot, completando assim o nosso pequeno passeio pelo editor do Unity e voltando para o código-fonte.



Função Shoot do Titanium Sentinela. Grande, não é?



A função Shoot é de fato curtíssima e há um motivo para isso. Porém, tendo em vista o tamanho que esta postagem está tomando, acho melhor deixar essa história para outra hora. Por fim, vamos falar da última (e mais longa) função do Sentinela: Movement.



Função Movement do Titanium Sentinela.



Todo o movimento do Sentinela é tratado dentro da Movement, inclusive outra função feita do zero chamada Flip, que pertence à classe Character (o que faz sentido considerando que Flip é "virar" em inglês e tanto o jogador quanto os inimigos são capazes de dar meia-volta), mas esse também é um assunto para a posterioridade.

Concluo a postagem de hoje lhes deixando um GIF do Sentinela em ação, executando todas as suas funções. Vejo vocês em breve.




Comentários