Se esta for a primeira vez que você visita textos de nossa série, considere-se especialmente convidado a juntar-se a nós em uma divertida jornada de aprendizados sobre o universo do desenvolvimento de games. Através da elaboração de diferentes projetos práticos de programação, descobriremos mais sobre como a ferramenta Unity pode nos auxiliar a criarmos nossos próprios jogos.
A partir do primeiro texto da série, são abordados desde os tópicos mais elementares do processo, como a instalação e a configuração da ferramenta em nossos computadores, até as etapas consideradas mais “desafiadoras”, que envolvem, por exemplo, a elaboração dos desafios de cada aventura, a criação das fases, o posicionamento de objetos em cena e a codificação das regras do jogo.
No momento, estamos elaborando o game Consultório do Dr. Tratanildo. Trata-se de um jogo ambientado em um consultório médico tridimensional, cujas características de gameplay prestam homenagens a clássicos dos anos 1980 e 1990, como Pac-Man (Namco, 1980) e Dr. Mario (Nintendo, 1990).
Não se preocupe caso ainda não tenha tido oportunidades para experimentar a codificação de jogos ou de sistemas, pois nossa série é elaborada especialmente pensando em quem tem vontade de tirar do papel os games de seus sonhos, mas nem sabe ainda por onde deve começar.
Se gostou dessa ideia, não perca mais tempo: junte-se a nós para que possamos, juntos, desvendar novos conhecimentos de uma forma lúdica e bem divertida.
Detectando colisões à frente
Após realizarmos extensas alterações nos conteúdos de ComportamentoDoenca, é chegada a hora de realizarmos as configurações adequadas para permitirmos aos agentes de doenças detectarem adequadamente os obstáculos que eles veem pela frente.
Uma forma interessante de permitirmos essa detecção, sem que o personagem precise, de fato, adentrar nas estruturas dos obstáculos ou dos outros agentes de doenças, é por meio da adoção de um pequeno detector transparente, posicionado logo à frente dos GameObjects dos personagens, que sofrerá as colisões com os demais objetos e indicará a seu respectivo monstrinho a necessidade de mudança de rota.
Para que esse detector funcione adequadamente, será necessário um pequeno ajuste no conteúdo de ComportamentoDoenca, além da criação de um script que irá se comunicar com o controlador do agente de doenças.
Iniciaremos nossas intervenções de hoje abrindo o projeto para edição. No Unity Hub, clique duas vezes sobre o item referente ao projeto Consultório do Dr. Tratanildo. Na interface inicial do editor, na aba Project, abra a pasta Assets, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene.
Na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do script ComportamentoDoenca, para que possamos realizar um pequeno acréscimo de código a seu conteúdo, por intermédio do Visual Studio.
Logo após o fechamento de chaves do último bloco de texto que codificamos em nosso encontro anterior, referente ao método Update, insira as seguintes linhas de código:
internal void OnTriggerExterno(Collider colisorExterno)
{
OnTriggerEnter(colisorExterno);
}
O papel de OnTriggerExterno no processo de detecção de colisões é o de permitir a conexão entre scripts externos e as verificações internas que codificamos em OnTriggerEnter para ComportamentoDoenca. Sendo mais específico, OnTriggerExterno atuará como uma “ponte” entre o script atrelado ao agente de doenças e o script que iremos criar em seguida, a ser atrelado ao detector auxiliar de colisões.
Salve o script, minimize o Visual Studio e retorne ao editor do Unity. Na aba Project, ainda com a pasta Scripts em evidência, clique com o botão direito sobre uma área vazia da janela. No menu suspenso, selecione a opção Create e, em seguida, C# Script.
Nomeie o novo script como “DetectorAuxiliarColisoes”, sem as aspas, conforme imagem exemplificativa a seguir. Em seguida, clique duas vezes sobre seu ícone para iniciarmos sua edição no Visual Studio.
Após a abertura do script para edição, realize a remoção dos códigos referentes às funções Start e Update, trocando-os pelo conteúdo descrito a seguir:
public ComportamentoDoenca controladorAgente;
private void OnTriggerStay(Collider other)
{
controladorAgente.OnTriggerExterno(other);
}
Note que, diferentemente de outras intervenções em código que realizamos até o momento para detecção de colisões, estamos utilizando agora a função OnTriggerStay. Esse método será chamado constantemente pelo jogo enquanto o colisor ao qual o script está atrelado estiver em contato com colisores externos.
Isso evitará problemas, por exemplo, em casos onde haja a rotação do agente de doenças e, tanto antes quanto depois da rotação, o monstrinho ainda esteja em contato com colisores que impeçam sua passagem.
Salve o script e retorne ao editor do Unity para iniciarmos algumas intervenções importantes a serem realizadas diretamente sobre GameObjects, Prefabs e outros elementos visuais.
Configurando as paredes e os obstáculos
A primeira intervenção que realizaremos por intermédio do editor do Unity será em relação às novas Tags a serem verificadas durante a execução do método OnTriggerEnter de ComportamentoDoenca.
Na aba Hierarchy, selecione os objetos LabParede1, LabParede2, LabParede3 e LabParede4, todos subordinados a Labirinto. Em seguida, na aba Inspector, abra a caixa de seleção da opção Tag e selecione a opção Add Tag..., conforme exemplificado a seguir:
Volte a selecionar os quatros objetos representantes de paredes, via aba Hierarchy, atrelando-os a Tag parede em seguida:
Outro GameObject que deverá receber a Tag parede é Cuberef, que encontra-se subordinado a Obstaculos. Como ele é o bloco de referência para a criação dos obstáculos internos, todos receberão a mesma Tag ao serem instanciados no labirinto.
Por fim, selecione simultaneamente CubeRef e os quatro objetos representantes das paredes e, via aba Inspector, acrescente a eles componentes do tipo RigidBody, por intermédio do botão Add Component. Altere os seguintes valores para os atributos dos componentes recém-introduzidos:
- Use Gravity: deixar a caixa de seleção vazia (false);
- Constraints: deixe todas as caixas de seleção marcadas (true), tanto para os valores de Freeze Position quanto para os de Freeze Rotation.
Um “para-choque” transparente
Agora, vamos realizar ajustes em aspectos relacionados aos agentes de doenças. Como todas as variantes de nossos queridos (e perigosos) monstrinhos derivam do modelo verde, ao realizarmos as intervenções necessárias diretamente sobre seu Prefab, não necessitaremos repetir a dose para os demais.Na aba Project, abra as pastas Assets, Multimedia, 3D e, por fim, NossasDoencas. Clique duas vezes sobre o ícone do Prefab DoencaVerde para iniciarmos a sua edição.
O primeiro passo envolverá a criação da Tag agenteDoenca e a configuração do Prefab para seu uso. Realizando passos semelhantes aos que fizemos para as paredes e obstáculos, conceda a nova Tag ao GameObject DoencaVerde:
Em seguida, conceda ao objeto DoencaVerde um componente do tipo RigidBody, desta vez alterando apenas o valor de Use Gravity para false, conforme indicado pela ilustração a seguir:
Por fim, ainda na aba Inspector, altere o valor dos seguintes atributos de seu componente Comportamento Doenca:
- Fator Deslocamento: conceda o valor 1;
- Liberar Caminhada: deixe a caixa de seleção marcada (true).
Embora, em código, tenhamos determinado anteriormente o valor false para LiberarCaminhada, iremos conceder o valor true momentaneamente para a realização de testes.
Agora, iremos criar o objeto transparente a ser posicionado na parte posterior do agente de doenças. Por ser o responsável pela detecção de colisões, acabará atuando como um “para-choque” transparente para nossos (nem tão) queridos monstrinhos.
Na aba Hierarchy, clique com o botão direito sobre o GameObject DoencaVerde e, em seguida, selecione a opção Create Empty. Conceda o nome “DetectorColisoes” ao novo objeto criado e modifique os valores dos atributos de seu componente Transform conforme listado a seguir:
- Position: X = 0, Y = 0, Z = 1.75;
- Rotation: X, Y e Z = 0;
- Scale: X, Y e Z = 1.
Ainda com DetectorColisoes em evidência, via aba Inspector adicione um componente do tipo Box Collider, alterando os valores das coordenadas X, Y e Z do atributo Size para 0.5.
Por fim, adicione um componente do tipo Detector Auxiliar Colisoes, indicando como valor para seu atributo Controlador Agente o GameObject principal deste Prefab (DoencaVerde):
Certificando-se de que a opção Auto Save está ativa, saia do modo de edição do Prefab e, na aba Project, clique duas vezes sobre outra variante de agente de doenças para certificar-se de que as alterações foram aplicadas a todos:
Com tudo sob controle, podemos fechar a visualização de edição de Prefabs e voltar à visualização padrão.
Ao realizarmos uma simulação de execução (aba Game, ícone do botão Play), depois de certificarmos que o paciente se deitou na cama do leito do consultório, se retornarmos à aba Scene durante a execução do jogo, ao focarmos o labirinto já podemos ter um vislumbre do comportamento dinâmico dos agentes de doenças:
Não se esqueça de, após finalizar a simulação da execução (clicando novamente sobre o ícone do botão Play), salvar a cena (menu File, opção Save) e o projeto (menu File, opção Save Project) antes de fechá-lo.
Próximos passos
Concluímos a implementação de mais uma funcionalidade importante do jogo, esta diretamente relacionada ao nível de desafio apresentado para cada caso clínico a ser enfrentado por Tratanildo Doencita e suas pílulas miraculosas.
Em nosso próximo encontro, continuaremos a realizar intervenções importantes em nosso projeto, envolvendo a comunicação entre os módulos de controle do labirinto e da fase como um todo.
Nosso próximo texto já encontra-se disponível, continue conosco nessa jornada de conhecimento e fique ligado sempre aqui no GameBlast!
Revisão: Ives Boitano






















