Caso esta seja a primeira vez que você acessa o conteúdo de nossa série, considere-se especialmente convidado a mergulhar de cabeça conosco em uma divertida jornada de aprendizados práticos sobre o universo do desenvolvimento de jogos digitais. Por meio do desenvolvimento de projetos práticos de programação, aprenderemos juntos sobre como a ferramenta Unity pode nos auxiliar a tirar do papel jogos diversos, de variados estilos gráficos e de gameplay.
A partir do primeiro texto de nossa série, abordamos desde a instalação da ferramenta em nossos computadores até a configuração dos projetos de desenvolvimento de games, a elaboração das fases e dos desafios de cada jogo proposto, além de discutirmos os pormenores das decisões tomadas em cada etapa de criação dos elementos presentes nas aventuras a serem desenvolvidas.
Até o momento, já elaboramos dois jogos bidimensionais: Forest Ping Pong, uma singela homenagem ao clássico Pong (Atari, 1972); e Motorista da Pesada, um “platformer rodoviário” inspirado no arcade City Connection (Jaleco, 1985).
Atualmente, estamos trabalhando na construção de Consultório do Dr. Tratanildo: trata-se de um puzzle ambientado em um excêntrico consultório médico tridimensional, cujos aspectos de gameplay prestam homenagem a clássicos dos anos 1980 e 1990, tais como Pac-Man (Namco, 1980) e Dr. Mario (Nintendo, 1990). Você pode conferir os dois primeiros jogos completos, além das etapas prévias de elaboração do terceiro game, por meio do índice disponibilizado no primeiro texto da série.
Fique tranquilo caso você não tenha experiências prévias com programação, pois nossa série é desenvolvida justamente para auxiliar quem tem vontade de construir seu jogo “do zero” a entender melhor os passos necessários para alcançar seu objetivo. Para isso, todas as ações tomadas são explicadas em detalhes, sobretudo aquelas que envolvam a criação de códigos de programação. Dessa forma, esperamos que, ao fim da série, você possa construir os seus próprios games com tranquilidade, tomando as decisões que julgar necessárias em cada etapa.
Se você gostou da ideia de poder criar seus próprios jogos, aperte os cintos e junte-se a nós em uma trilha repleta de novos conhecimentos e de muita diversão!
Duas mãos, duas pílulas
Um dos comportamentos indesejados que observamos durante os testes realizados em nossos últimos encontros envolveu a questão da coleta dos medicamentos nas bancadas do consultório por Tratanildo Doencita. Embora os scripts que codificamos permitam pegarmos e devolvermos as pílulas de saúde coloridas que desejarmos, no estado atual do projeto o médico só pode carregar em cada mão pílulas de cores diferentes, impedindo a realização de um tratamento acelerado em casos de infecções generalizadas causadas por agentes de doenças de mesma coloração.
Por meio de alguns ajustes no conteúdo dos scripts controladores da coleta de pílulas e da barra inferior do Canvas, conseguiremos resolver essa questão de forma simples. Para tal, vamos abrir nosso projeto para edição. No Unity Hub, clique duas vezes sobre o item referente a ele. Na interface inicial do editor, na aba Project, abra a pasta Assets, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene.
O primeiro script a sofrer intervenções será o responsável por permitir a coleta das pílulas no cenário. Na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do script PegaPilula para iniciarmos sua edição.
Dentro da estrutura de OnTriggerEnter, temos a presença de códigos que determinam o que deverá ser exibido pela barra inferior, dependendo do que for identificado nas mãos do médico. Destaco especialmente o trecho representado pela imagem a seguir, que condensa as regras do algoritmo em algumas estruturas de decisão:
Note que, apesar de ser um código conciso, bem organizado e fiel às regras estipuladas, por meio de sua execução não temos previstas situações específicas envolvendo, por exemplo, a possibilidade de se pegar duas pílulas da mesma cor simultaneamente, sendo exibida ao jogador apenas a opção de se devolver a pílula já coletada.
Para que o comportamento esperado possa ocorrer, vamos realizar um ajuste no código, trocando o trecho em destaque pelo descrito a seguir:
// Regras do algoritmo a seguir:
// - Se não pegou uma pílula do tipo da que está com esse script atrelado:
// - Está com, ao menos, uma mão vazia:
// Opção a ser exibida: Pegar pílula
// - Está com as duas mãos cheias:
// Não mostrar opção
// - Se já está com uma pílula do tipo em mãos:
// - Está com uma mão vazia:
// Opção a ser exibida: Pegar outra pílula
// - Está com as duas mãos cheias:
// - As duas mãos têm pílulas do mesmo tipo:
// Opção a ser exibida: Devolver as duas pílulas
// - Somente uma mão tem pílulas do tipo:
// Opção a ser exibida: Devolver pílula
bool ativarBarraInferior = true;
if (!jaPegouEssaPilulaMaoDir & !jaPegouEssaPilulaMaoEsq)
{
if (temPilulaMaoDir & temPilulaMaoEsq)
ativarBarraInferior = false;
else barraInferior.TextoBarraInferior.text = "Pegar pílula " + tipoPilula;
}
else if (!(jaPegouEssaPilulaMaoDir & jaPegouEssaPilulaMaoEsq))
{
if (temPilulaMaoDir & temPilulaMaoEsq)
barraInferior.TextoBarraInferior.text = "Devolver pílula " + tipoPilula;
else barraInferior.TextoBarraInferior.text = "Pegar outra pílula " + tipoPilula;
}
else
barraInferior.TextoBarraInferior.text = "Devolver as duas pílulas";
As alterações realizadas permitirão ao game fornecer mais opções úteis ao jogador, na hora em que ele for buscar os medicamentos para o tratamento.
Em situações que envolvam o uso de mais de uma pílula da mesma cor, a quantidade de viagens entre a prateleira e o maquinário para tratamento pode se reduzir até a metade, dependendo do caso. Em um jogo em que a passagem de tempo importa, isso pode ser a diferença crucial entre conseguirmos tratar o paciente ou tomarmos um game over bem dolorido.
Salve o script, minimize-o e volte à interface do editor do Unity para que possamos abrir outro script para edição. Na aba Project, ainda com a pasta Scripts em evidência, clique duas vezes sobre o ícone de ControllerBarraInferior para editarmos seu conteúdo no Visual Studio.
As alterações no controlador da barra inferior serão bem simplificadas, para que o algoritmo referente à identificação do botão pressionado possa entender as novas opções que codificamos em PegaPilula, como, por exemplo, “Pegar outra pílula” ou “Devolver as duas pílulas”.
Dentro da estrutura de void Update, localize os códigos a seguir e realize as respectivas substituições:
De: if (TextoBarraInferior.text.StartsWith("Pegar pílula"))
Para: if (TextoBarraInferior.text.StartsWith("Pegar"))
De: else if (TextoBarraInferior.text.StartsWith("Devolver pílula"))
Para: else if (TextoBarraInferior.text.StartsWith("Devolver"))
Note que, como estamos utilizando a função StartsWith para verificarmos o texto presente na barra de opções, basta informar o trecho inicial em comum das opções oferecidas para que todas sejam observadas. Em outras palavras, o mesmo código que tratava de casos como “Pegar pílula amarela” ou “Pegar pílula roxa” também dará conta de realizar as mesmas ações quando a opção apresentada for “Pegar outra pílula verde”, visto que o verbo “Pegar” é comum a todas essas opções.
Vale ressaltar que, em jogos mais complexos, essa abordagem pode não ser a mais eficiente, sobretudo se o jogo der suporte a múltiplos idiomas. Nesses casos, outras formas de comparação que não envolvam a leitura do texto presente em um objeto Text, tais como a análise de opções dentro de um índice em memória, por exemplo, podem ser mais adequadas.
Salve o script e retorne ao editor do Unity para testarmos as alterações realizadas. Vá até a aba Game e clique sobre o ícone do botão Play:
Perceba que, embora o jogo apresente as novas opções de forma correta, temos um problema a corrigir: as novas opções só são apresentadas ao jogador após Tratanildo sair e entrar novamente na área delimitada pelo colisor em modo trigger de cada pílula cenográfica.
Usando a função OnTriggerStay
Interrompa a simulação, clicando novamente sobre o ícone do botão Play e voltando à aba Scene. Via aba Project, volte a abrir o script PegaPilula para edição no Visual Studio.
Realize a seguinte substituição de linha de código:
De: private void OnTriggerEnter(Collider other)
Para: private void OnTriggerStay(Collider other)
A função OnTriggerEnter, como o nome já denuncia, somente é executada pelo jogo no momento em que um objeto adentra a área de seu colisor em modo trigger. Já o código de OnTriggerStay é executado a cada quadro (frame) em que um objeto encontra-se dentro da área delimitada de seu colisor.
Em nosso caso concreto, como nossas regras para coleta de pílulas podem envolver mais de uma ação enquanto o médico permanece dentro da área de coleta (por exemplo, pegar duas pílulas da cor verde), é importante que o jogo esteja atento a essas regras enquanto o médico estiver na área delimitada. Com OnTriggerStay, as regras serão interpretadas pelo jogo de forma constante, permitindo à barra inferior mostrar as opções adequadas sem precisarmos nos deslocar pelo cenário constantemente.
Salve o script e feche o Visual Studio. Voltando ao editor do Unity, experimente simular mais uma vez a execução do game:
Com essas alterações, conseguimos melhorar substancialmente o comportamento do jogo ao pegarmos pílulas para o tratamento. Ao final das experimentações, não se esqueça de interromper a simulação da execução, clicando novamente sobre o ícone do botão Play e retornando à aba Scene. Salve a cena (menu File, opção Save) e o projeto (menu File, opção Save Project) antes de fechar o Unity.
Próximos passos
De correção em correção, é cada vez mais nítido que o núcleo de nosso jogo está se tornando mais agradável para ser manuseado pelo jogador. Ainda temos pela frente um ciclo de melhorias e de implementações importantes, mas já dá para ter o gostinho de que estamos produzindo algo bem divertido. Parabéns por ter chegado a esta etapa!
Em nossos próximos encontros, daremos sequência ao processo de implementação de melhorias no game, com foco em corrigirmos comportamentos indesejados para o núcleo do jogo, visando termos condições de andar em frente na construção das demais funcionalidades de nosso projeto.
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












