Caso esta seja a primeira vez que você lê conteúdos sobre nossa série, considere-se especialmente convidado a nos acompanhar em uma trilha repleta de aprendizados sobre o fascinante mundo do desenvolvimento de jogos digitais.
Utilizando a ferramenta Unity como apoio para nosso aprendizado, iremos descobrir juntos maneiras interessantes de se criar games dos mais diversos estilos gráficos e de gameplay.
Periodicamente, realizamos intervenções em projetos práticos de programação de jogos, cuja construção vamos elaborando a cada encontro da série. A cada “tijolinho” posto, nos aproximamos cada vez mais da conclusão da construção de nossos games; por consequência, aprendemos diversos conceitos sobre assuntos importantes do processo como um todo, como aspectos envolvidos na concepção e materialização de fases, personagens, obstáculos, adversários e regras de uma aventura.
Por falar em aventura, atualmente estamos trabalhando no projeto do terceiro game de nossa série. Trata-se do game Consultório do Dr. Tratanildo, um puzzle ambientado em um consultório médico tridimensional, cujos aspectos de gameplay prestam homenagem a clássicos dos anos 1980 e 1990, como Pac-Man (Namco, 1980) e Dr. Mario (Nintendo, 1990).
Além deste jogo, concluímos anteriormente o desenvolvimento de dois jogos bidimensionais muito interessantes: Forest Ping Pong e Motorista da Pesada. Vale a pena conferi-los, além das demais entradas da série, por meio do índice disponibilizado no início do primeiro texto disponibilizado.
Dadas as introduções, fica aqui o convite: caso você tenha o desejo de tirar do papel aquele jogo que sempre sonhou em ver se tornar realidade, não se acanhe e junte-se a nós em uma divertida trilha rumo a novos conhecimentos.
Início e fim de controle
Após mais de setenta e cinco encontros trabalhando no projeto Consultório do Dr. Tratanildo, podemos afirmar com propriedade que elaboramos um conjunto interessante de funcionalidades e módulos dentro do escopo de nosso game. Porém, mesmo realizando inúmeras experimentações e simulações de execução, ainda sentimos falta de vermos os módulos do jogo em ação sendo executados de forma encadeada, como um “jogo de verdade” deve ser.
Pois bem, é chegado o momento de nos permitirmos vivenciar essa experimentação, mesmo que com muitos detalhes ainda a serem consertados ou implementados. E tudo isso se dará por meio de intervenções em dois scripts velhos conhecidos nossos.
Sem perdermos mais tempo, vamos colocar as mãos na massa. Abra nosso projeto para edição, por meio do Unity Hub, clicando 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.
Na aba Project, abra a pasta Assets e, em seguida, a pasta Scripts. Clique duas vezes sobre o ícone do script ControllerFase para iniciarmos sua edição no Visual Studio.
A primeira intervenção que realizaremos será sobre a Coroutine MostrarLabirintoPacientes. Anteriormente, ao elaborarmos a lógica presente em seu código, havíamos determinado que, ao fim das operações realizadas, seriam executados os códigos de TransicaoParaTratamento, conforme podemos recordar por meio da imagem a seguir:
Porém, se cogitarmos utilizar a Coroutine MostrarLabirintoPacientes para exibir o labirinto durante o manejo das máquinas, devemos nos atentar a um fato importante: uma das ações concretizadas pelo método TransicaoParaTratamento é o desligamento da visualização do labirinto, que é levada a cabo logo após uma pausa de alguns segundos.
No momento, não queremos que essa ação em específico seja realizada, pois nossa ideia para o momento é a exibição do labirinto durante o tempo em que o jogador manejar a inclinação da cama hospitalar.
Para permitir que a Coroutine seja útil tanto no momento introdutório do game, durante a conversa entre paciente e médico, quanto durante os momentos em que já fora iniciada a etapa de tratamento, precisaremos realizar duas pequenas intervenções em sua estrutura.
Substitua a seguinte linha de código:
private IEnumerator MostrarLabirintoPacientes(int segundos, bool ehNovoTratamento)
Por esta:
private IEnumerator MostrarLabirintoPacientes(int segundos, bool ehNovoTratamento, bool controlarLabirinto = false)
Logo após, em relação aos códigos presentes dentro das chaves da Coroutine, substitua a linha com a chamada à função TransicaoParaTratamento pelos comandos descritos a seguir:
if (controlarLabirinto == false)
TransicaoParaTratamento(ehNovoTratamento);
A imagem a seguir ilustra as duas intervenções realizadas:
Uma observação interessante que podemos realizar sobre a nova variável controlarLabirinto é que, mesmo dentro dos parênteses da declaração da Coroutine, já concedemos um valor padrão para ele (false).
A concessão prévia de um valor a uma variável que, normalmente, tem seu valor “decidido” assim que outros trechos de código iniciem uma função ou Coroutine é estratégica, pois permite que trechos de código que não previam a passagem de um valor para controlarLabirinto continuem a funcionar normalmente. Dessa forma, não precisaremos sair abrindo todos os nossos scripts para edição, caçando trechos que, em algum momento, fazem referência a MostrarLabirintoPacientes para serem corrigidos.
Por fim, em relação à segunda intervenção, apenas em casos onde controlarLabirinto tenha valor falso (false) é que a transição para a etapa de tratamento será realizada; ou seja, a imagem de visualização do labirinto continuará ativa enquanto estivermos manejando o equipamento atrelado ao leito hospitalar.
Nossa próxima intervenção será realizada no final do arquivo, imediatamente antes do fechamento da última chave do script, acrescentando as seguintes linhas de código:
public void IniciarControleLabirinto()
{
Geral.ModoDeJogoCorrente = "Labirinto";
StartCoroutine(MostrarLabirintoPacientes(0, false, true));
}
public void InterromperControleLabirinto()
{
TransicaoParaTratamento(false);
}
A função IniciarControleLabirinto será útil para permitir ao jogador controlar o maquinário, enxergando o que ocorre dentro do labirinto. Note que é fornecido o valor verdadeiro (true) para o terceiro parâmetro de MostrarLabirintoPacientes, no caso, correspondente ao recém-implementado controlarLabirinto.
Já a função InterromperControleLabirinto, como seu nome sugere, permitirá ao jogador parar de manejar o equipamento, desligando a visualização do labirinto e liberando o médico para movimentação pelo cenário, por intermédio de uma chamada ao método TransicaoParaTratamento.
Ligando os pontos
Salve o script e minimize o Visual Studio. Retornando ao editor do Unity, ainda com a pasta Scripts em evidência na aba Project, clique duas vezes sobre o ícone do script ControllerBarraInferior para iniciarmos sua edição.
As alterações que realizaremos a seguir visam tanto apresentar em tela opções relativas ao manejo da máquina atrelada ao leito hospitalar quanto impedir o desligamento da barra inferior do Canvas durante a operação do maquinário, substituindo esse comportamento pela exibição de uma opção para interromper o manejo da inclinação da cama, se assim o jogador desejar.
No final do script, substitua o código relativo ao desligamento da barra inferior pelo conteúdo descrito a seguir:
// Caso a opção informada no texto da barra inferior seja para manusear o equipamento do leito,
// o procedimento para se iniciar o controle do labirinto será executado.
else if (TextoBarraInferior.text.StartsWith("Manusear equipamento"))
controladorFase.IniciarControleLabirinto();
// Caso a opção informada no texto da barra inferior seja para deixar de manusear o equipamento,
// é acionado o procedimento de interrupção do controle do labirinto.
else if (TextoBarraInferior.text.StartsWith("Interromper o manuseio do equipamento"))
controladorFase.InterromperControleLabirinto();
// Por fim, desliga-se a barra inferior, exceto se o modo de jogo corrente for "Labirinto".
// Nesse caso, o texto é alterado para refletir a disponibilização da opção
// de saída do modo de controle do labirinto ao jogador.
if (Geral.ModoDeJogoCorrente == "Labirinto")
TextoBarraInferior.text = "Interromper o manuseio do equipamento";
else
gameObject.SetActive(false);
}
Note que, dentro do conjunto de códigos acrescentados a ControllerBarraInferior, tanto IniciarControleLabirinto quanto InterromperControleLabirinto são referenciados. De certa forma, ao concluirmos essas ligações, a seguinte cadeia de ações é estruturada:
- Paciente chega ao consultório;
- A primeira interação entre médico e paciente ocorre no corredor;
- Inicia-se a corrida contra o tempo: Doutor Tratanildo percorre o cenário, coletando medicamentos;
- Ao chegar perto do leito hospitalar, é possível conceder pílulas miraculosas ao paciente e, em seguida, controlar o maquinário atrelado à cama;
- Se necessário, o jogador pode sair do modo de controle do labirinto e retornar à visualização de Tratanildo em terceira pessoa, podendo percorrer o consultório buscando mais medicamentos.
Com essa tão bem-vinda novidade, é hora de salvarmos o script, fecharmos o Visual Studio e voltarmos ao editor do Unity para experimentarmos a execução do game (aba Game, ícone do botão Play):
Experimente as múltiplas possibilidades da integração entre os módulos, por exemplo, aniquilando um monstrinho e retornando ao cenário para coletar mais pílulas:
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
Primeiramente, parabéns por ter alcançado esta etapa do desenvolvimento de nosso game; uma etapa em que, claramente, conseguimos sentir que temos em mãos um jogo cada vez mais próximo daquilo que almejamos.
Por meio das experimentações, provavelmente você deve ter percebido que temos ainda bastante trabalho pela frente. Questões como a impossibilidade de se pegar duas pílulas da mesma cor simultaneamente, a permanência do paciente inclinado ao sair do modo de controle do maquinário ou mesmo quando as pílulas, sob determinadas situações, saem “voando pelo ar” (que lindo!) são importantes e precisam ser tratadas.
Em nossos próximos encontros, iniciaremos a correção de algumas dessas situações observadas. Em seguida, partiremos para a confecção das condições para se determinar uma vitória após o êxito no tratamento de um paciente, a construção das ligações entre as fases e, por fim, produziremos o menu inicial de nosso jogo, finalizando a saga de nosso terceiro game.
Nosso próximo encontro será no dia 14 de dezembro. Até mais! Fique sempre ligado nas novidades do GameBlast!
Revisão: Ives Boitano














