Aprendendo a programar jogos em Unity: conclusão da caminhada inicial do paciente

Realizaremos a conclusão da elaboração das interações iniciais entre paciente e médico no game.

em 17/08/2025
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Em nosso encontro anterior, avançamos na implementação das etapas de interação entre paciente e doutor, configurando a exibição de mensagens na tela que representarão as falas dos personagens. Hoje, daremos sequência ao processo de elaboração da sequência de ações inicial do paciente, realizando uma primeira ligação entre as etapas preliminares e a etapa de ação do jogo.

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 AssetsScenes 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:
  1. Desligar elementos presentes no Canvas referentes ao diálogo entre personagens em cena;
  2. Rotacionar o paciente para que possa se deslocar até a posição-alvo (proximidades da cama hospitalar);
  3. Rotacionar o doutor em direção ao paciente, durante a caminhada deste último ao leito;
  4. 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);
  5. 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
Siga o Blast nas Redes Sociais
Rodrigo Garcia Pontes
Entendo videogames como sendo uma expressão de arte e lazer e, também, como uma impactante ferramenta de educação. No momento, doutorando em Sistemas da Informação pela EACH-USP, desenvolvendo jogos e sistemas desde 2020. Se quiser bater um papo comigo, nas redes sociais procure por @RodrigoGPontes.
Este texto não representa a opinião do GameBlast. Somos uma comunidade de gamers aberta às visões e experiências de cada autor. Você pode compartilhar este conteúdo creditando o autor e veículo original (BY-SA 4.0).