Se esta for a primeira vez que você acessa conteúdos de nossa série, considere-se especialmente convidado a juntar-se a nós em uma interessante jornada rumo a novos conhecimentos. Desenvolvendo projetos práticos de programação, você terá a oportunidade de experimentar e descobrir como a ferramenta Unity pode nos auxiliar a criar jogos dos mais diferentes estilos gráficos e de gameplay.
Não se preocupe se, em um primeiro momento, considerar que os conteúdos da série são complexos ou de difícil compreensão. A partir do primeiro tópico da série, os conceitos apresentados são abordados de forma a permitir a criação de um jogo “do zero” mesmo àqueles que nunca tiveram a oportunidade de conhecer tópicos de programação de jogos ou de sistemas: abordamos desde os conceitos mais básicos, como a instalação da ferramenta Unity em nossos computadores, até as etapas que envolvem o desenvolvimento, de fato, de um jogo, de suas regras, interações entre elementos e configuração de materiais visuais e sonoros das fases.
No momento, estamos trabalhando no projeto do game Consultório do Dr. Tratanildo: trata-se de um jogo ambientado em um consultório médico tridimensional, cujas características de gameplay mesclam referências e homenagens a clássicos dos anos 1980 e 1990, tais como Dr. Mario (Nintendo, 1990) e Pac-Man (Namco, 1980).
Durante a elaboração da série já concluímos a criação de outros dois jogos bem interessantes: Forest Ping Pong e Motorista da Pesada. Vale muito a pena conferi-los também, por meio do índice disponível no primeiro texto da série.
Dito isso, queremos saber: você gostou da ideia de tirar do papel aquele jogo que sempre sonhou em tornar realidade? Então, não perca esta oportunidade e siga conosco em uma inesquecível trilha, repleta de novos conhecimentos e de muita diversão!
Concluindo a caminhada
Dando sequência às atividades de elaboração das interações iniciais entre paciente e médico, as próximas etapas consistem no deslocamento do paciente em direção à cama do leito e na “passagem de bastão” da ação ao jogador, permitindo que ele movimente o médico pelo cenário e dê início aos tratamentos.
Nem todas as etapas desse processo serão resolvidas pelas intervenções que realizaremos hoje, mas as que forem implementadas nesse encontro com certeza auxiliarão na construção das interações definitivas entre os personagens.
Sem mais delongas, mãos à massa: vamos abrir nosso projeto para edição, indo ao Unity Hub e clicando 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.
As intervenções que realizaremos hoje serão concentradas no conteúdo do script ControllerFase. Para editarmos seu conteúdo, na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do referido script para que ele seja aberto pelo Visual Studio.
Antes de inserirmos novos conteúdos no corpo do script, vale a pena elencarmos quais ações deverão ser realizadas pelo jogo após a sequência de diálogos entre Doutor Tratanildo e o paciente da vez. Basicamente, será necessária a realização das seguintes atividades:
- Desligar elementos presentes no Canvas referentes ao diálogo entre personagens em cena;
- Rotacionar o paciente para que possa se deslocar até a posição-alvo (proximidades da cama hospitalar);
- Rotacionar o doutor em direção ao paciente, durante a caminhada deste último ao leito;
- Após a chegada do paciente ao leito, modificar a câmera a ser exibida em tela, permitindo ao jogador ver o paciente sobre a cama e o estado inicial de sua doença (em outras palavras, a imagem sobreposta do labirinto);
- Finalizar a exibição temporária do paciente e permitir a livre movimentação do médico pelo cenário.
O primeiro passo dessa sequência de ações virá por meio da inserção de uma nova Coroutine. Ela será responsável pela gradual movimentação do paciente em direção ao leito, além de controlar o tempo de exibição temporária na tela do paciente sobre o leito.
Para tal, insira o seguinte bloco de código após o fechamento de chaves da função MostrarMensagemMedico:
IEnumerator caminhadaPacienteLeito()
{
// Desligar itens do Canvas
objetoColliderCanvas.SetActive(false);
mensagemPapelDireita.transform.parent.gameObject.SetActive(false);
// Iniciar caminhada
pacienteCenario.GetComponent<Animator>().SetBool("caminharPeloCenario", true);
etapaAtual = "PacienteCaminhadaAoLeito";
// Interromper caminhada quando paciente chegar bem perto de posicaoPacienteIndoAoLeito
while (Vector3.Distance(pacienteCenario.transform.position, posicaoPacienteIndoAoLeito) > 0.25f)
{
pacienteCenario.transform.LookAt(posicaoPacienteIndoAoLeito);
doutorConversa.transform.LookAt(pacienteCenario.transform.position);
yield return new WaitForEndOfFrame();
}
// Mostrar o paciente no leito e suas doenças por 3 segundos
pacienteCenario.SetActive(false);
doutorConversa.SetActive(false);
pacienteNoLeito.SetActive(true);
camPacienteIndoAoLeito.gameObject.SetActive(false);
foreach (Camera camTratamento in camerasTratamento)
camTratamento.gameObject.SetActive(true);
controladorLabirinto.gameObject.SetActive(true);
visualizacaoLabirinto.SetActive(true);
yield return new WaitForSeconds(3);
TransicaoParaTratamento();
}
Análise do código
Por meio da execução da Coroutine caminhadaPacienteLeito, as quatro primeiras atividades elencadas da lista serão atendidas. Sobre os comandos inseridos, vamos a algumas observações interessantes:
- Embora tenhamos iniciado a caminhada do paciente (bloco de código “Iniciar caminhada”) antes da concretização de sua rotação em direção ao alvo, pelas ações ocorrerem antes do primeiro yield return da Coroutine, na prática, ambas serão executadas no mesmo frame. Por isso, o paciente irá andar na direção correta desde o início da execução da Coroutine.
- Assim como ocorre com o médico, a representação do paciente é realizada por mais de um GameObject: pacienteCenario, que anda pelos corredores do consultório, e pacienteNoLeito, que já está posicionado sobre a cama hospitalar.
- Em um primeiro momento, não precisaremos indicar ao Unity a necessidade de se montar o labirinto antes de ativarmos o GameObject ao qual o conteúdo da variável controladorLabirinto está atrelado. Isso deve-se ao fato de que, durante a construção do script MontaLabirinto (o tipo de controladorLabirinto), indicamos que, na ativação de um objeto com script desse tipo atrelado, a montagem seria realizada de forma automática.
- O vetor camerasTratamento contempla as duas câmeras que representam a etapa de tratamento do jogo: especificamente a câmera presente sobre o paciente acamado e a câmera que flagra a ação dos medicamentos sobre os agentes de doenças no labirinto.
- A imagem do paciente no leito e de suas enfermidades será exibida na tela durante três segundos, sendo que, logo após, a função TransicaoParaTratamento será executada, responsável pela conclusão das atividades elencadas na lista. Iremos elaborá-la em instantes.
Logo após o bloco de comandos recém-introduzido ao script, insira as seguintes linhas de código:
public void TransicaoParaTratamento()
{
// Desligar visualização e acionar doutorCenario
foreach (Camera camTratamento in camerasTratamento)
camTratamento.gameObject.SetActive(false);
visualizacaoLabirinto.SetActive(false);
doutorCenario.SetActive(true);
etapaAtual = "Tratamento";
}
Embora bem mais curta do que a Coroutine que elaboramos há pouco, a função TransicaoParaTratamento também tem sua importância, permitindo a efetiva transição entre a cutscene inicial da aventura e o controle do médico pelo jogador.
Por fim, vamos acrescentar mais uma condição (case) à estrutura de decisão switch (etapaAtual) da função ProximaEtapa. Para isso, introduza as linhas abaixo:
case "DialogoMedicoPaciente":
StartCoroutine(caminhadaPacienteLeito());
break;
Após a exibição do último diálogo, quando o jogador clicar novamente na tela de jogo, a Coroutine que elaboramos há pouco terá sua execução iniciada, devido ao fato de termos alterado o valor da variável etapaAtual logo após a exibição da fala do doutor ao paciente, implementada durante as intervenções em código que realizamos em nosso último encontro.
Salve o script e feche o Visual Studio. Retorne ao editor do Unity, vá até a aba Game e clique sobre o ícone do botão Play para ver, na prática, toda a sequência inicial do jogo que elaboramos:
Interrompa a simulação, clicando novamente sobre o ícone do botão Play e voltando à aba Scene. Não se esqueça de salvar a cena (menu File, opção Save) e o projeto (menu File, opção Save Project) antes de fechar o editor.
Próximos passos
Aos poucos, conseguimos ver o jogo tomar forma da maneira que planejamos. Parabéns por ter alcançado essa etapa do desenvolvimento do projeto!
Embora a transição esteja bem interessante, ainda temos muitas atividades a realizar, bugs a corrigir e arestas a aparar para que as fases, de fato, surjam em cena e a ação flua de uma forma divertida e consistente. Nos próximos encontros, continuaremos a realizar acréscimos ao projeto e ajustes às funcionalidades que implementamos.
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










