Aprendendo a programar jogos em Unity: as primeiras falas do paciente e do médico

Prosseguiremos configurando os elementos e códigos que permitirão concluir a interação inicial entre paciente e médico.

em 10/08/2025
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Em nosso encontro anterior, realizamos a inserção, em nosso projeto, da primeira Coroutine em um script de controle, ajudando-nos a controlar o deslocamento inicial do paciente pelo cenário. Continuaremos hoje a implementar etapas pertencentes a essa interação inicial entre enfermo e médico, introduzindo a aparição da fala dos personagens em cena.

Se esta for a primeira vez que você lê conteúdos de nossa série, sinta-se especialmente convidado a nos acompanhar em uma interessante jornada rumo a novos conhecimentos. Por meio do desenvolvimento de projetos práticos de programação de games, descobriremos mais sobre como a ferramenta Unity pode nos auxiliar a criar jogos dos mais diferentes estilos gráficos e de gameplay.

Embora, à primeira vista, os conteúdos da série possam parecer complexos e de difícil compreensão, não se deixe levar pelas primeiras aparências: nossos textos são criados de forma a permitir, mesmo a quem nunca teve experiências prévias de programação de jogos ou de sistemas, a tirar do papel aquele game que sempre sonhou em ver se tornar realidade.

A partir do primeiro tópico da série, são abordados desde os conceitos mais básicos do processo, como a instalação da ferramenta Unity em nossos computadores, até as etapas que envolvem a inserção e configuração de elementos multimídia nos cenários e a codificação de regras e de comportamentos por meio de scripts controladores.

No momento, estamos desenvolvendo o game Consultório do Dr. Tratanildo: trata-se de um puzzle que mescla características de jogos ambientados em cenários tridimensionais com elementos de jogabilidade inspirados em clássicos como Dr. Mario (Nintendo, 1990) e Pac-Man (Namco, 1980).


No primeiro tópico da série, você encontrará um índice que cobre desde as etapas iniciais da elaboração do game atual até os textos que abordam o desenvolvimento dos últimos dois jogos que criamos durante a série: Forest Ping Pong e Motorista da Pesada. Vale a pena conferi-los!

E então, o que você achou da ideia de criar o seu próprio game? Não perca esta oportunidade e siga conosco em uma inesquecível trilha, repleta de novos conhecimentos e de muita diversão!

Interagindo com o médico

Depois de configurarmos a caminhada inicial do paciente pelo cenário, é chegada a hora de prosseguirmos com a implementação da interação entre o paciente e Doutor Tratanildo Doencita. Para tal, já havíamos configurado anteriormente no Canvas elementos que exibirão em tela mensagens entre o enfermo e o médico (Mensagem_Esq, TextoMensagem_Esq, Mensagem_Dir e TextoMensagem_Dir).

Por meio de inserção de novos códigos em script controlador e alterações em parâmetros de elementos via editor do Unity, vamos avançar mais um pouco na formulação das interações iniciais, ativando esses elementos e exibindo em tela as mensagens adequadas.

Para tal, 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.

Nossa primeira intervenção de hoje será nos códigos do script controlador de fases. Na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do script ControllerFase para iniciarmos sua edição no Visual Studio.

Vamos começar introduzindo duas novas variáveis no script: na parte inicial do arquivo, acrescente a seguinte linha ao final do bloco de código que contém variáveis que armazenam informações sobre a fase corrente:

    internal string etapaAtual;

Ainda na parte inicial do arquivo, localize o bloco de código que contém variáveis representando os elementos da cena e insira a seguinte linha de código junto aos elementos de tipo GameObject declarados ali:

    public GameObject objetoColliderCanvas;

Embora a ordem de declaração de variáveis não faça diferença aqui, é interessante agruparmos elementos semelhantes para facilitar sua localização no código posteriormente.

As duas variáveis que declaramos serão utilizadas por estruturas de código a serem inseridas mais adiante para indicar qual é a etapa atual das interações entre paciente, médico e o tratamento em si (etapaAtual), e qual é o objeto do Canvas da cena que será ativado ou desativado pelo código, permitindo ou não a passagem para a próxima etapa por meio de interação via cliques (objetoColliderCanvas).

Em seguida, dentro das chaves de AtenderPaciente, insira a seguinte linha de código antes do comando de inicialização da Coroutine caminhadaInicialPaciente:

        etapaAtual = "PacienteCaminhadaInicial";

Dentro da estrutura de códigos de caminhadaInicialPaciente, é a vez de introduzirmos uma chamada à próxima etapa de interação, inserindo o seguinte bloco de código antes do fechamento de chaves da referida Coroutine:

        // Montar mensagem na tela, fala inicial do paciente
        yield return new WaitForSeconds(1f);
        MostrarMensagemPaciente();

Veja que, além de indicarmos ao Unity uma pausa de um segundo logo após o reposicionamento do paciente em cena, introduzimos uma chamada à função MostrarMensagemPaciente. Como ela ainda não existe, o Visual Studio exibe logo abaixo de seu nome uma linha vermelha. Essa linha sairá de cena agora, ao introduzirmos, logo após o fechamento de chaves de caminhadaInicialPaciente, o seguinte bloco de códigos:

    public void MostrarMensagemPaciente()
    {
        // Troca de câmera
        camDialogoPacienteDoutor.gameObject.SetActive(true);
        camPosicaoInicialPaciente.gameObject.SetActive(false);

        // Ativa a mensagem e exibe na tela
        mensagemPapelEsquerda.transform.parent.gameObject.SetActive(true);
        mensagemPapelEsquerda.text = FalaPaciente[faseCorrente];

        objetoColliderCanvas.SetActive(true);
        etapaAtual = "DialogoPacienteMedico";
    }

Como os comentários dentro do bloco de código já indicam, a função será responsável por realizar tanto a troca de câmera ativa quanto por exibir a mensagem do paciente em tela, por meio do GameObject mensagemPapelEsquerda.

Note também que, em vez de ativarmos o objeto ao qual o elemento mensagemPapelEsquerda está atrelado, ativaremos o GameObject hierarquicamente acima de mensagemPapelEsquerda, ou seja, o “papelzinho” que circunda a mensagem em si. Também houve a modificação do conteúdo de etapaAtual, refletindo a ação que foi realizada no momento.

Logo após o código recém-introduzido ao script, insira o seguinte trecho de comandos ao arquivo:

    public void MostrarMensagemMedico()
    {
        // Troca de câmera
        camDialogoPacienteDoutor.gameObject.SetActive(false);
        camPacienteIndoAoLeito.gameObject.SetActive(true);

        // Ativa a mensagem e exibe na tela
        mensagemPapelEsquerda.transform.parent.gameObject.SetActive(false);
        mensagemPapelDireita.transform.parent.gameObject.SetActive(true);
        mensagemPapelDireita.text = FalaDoutor[faseCorrente];

        etapaAtual = "DialogoMedicoPaciente";
    }

Embora bem semelhante, o código de MostrarMensagemMedico realizará, de certa forma, ações opostas às de MostrarMensagemPaciente, ao desativar tanto a câmera quanto a mensagem exibida em tela relativas ao paciente, trocando-as pelo conjunto de GameObjects que exibirão a comunicação do médico.

Por fim, para realizarmos a ligação entre essas duas etapas, introduza o seguinte trecho de código logo após o fechamento de chaves de MostrarMensagemMedico:

    public void ProximaEtapa()
    {
        switch (etapaAtual) 
        {
            case "DialogoPacienteMedico":
                MostrarMensagemMedico();
                break;
        }
    }

Assim que ProximaEtapa for acionado, ao verificar qual é a etapa atual da interação entre médico e paciente, caso seja a etapa em que está sendo exibida a mensagem do paciente direcionada ao médico, ele chamará a função MostrarMensagemMedico. Porém, se analisarmos o código como um todo, em nenhum momento ProximaEtapa é explicitamente referenciado.

Para realizarmos a passagem entre estados, iremos contar com a “ajuda” de um componente a ser estrategicamente configurado em cena. Portanto, salve o script, feche o Visual Studio e retorne ao editor do Unity.

Um Collider estratégico

Na aba Hierarchy, clique com o botão direito sobre o objeto Canvas e, no menu suspenso apresentado, selecione a opção UI e, em seguida, Image, conforme exemplificado pela imagem a seguir:

Ao novo GameObject criado, conceda o nome “ColliderProximaEtapa”, sem as aspas. Selecione-o e, via aba Inspector, altere os seguintes valores dos atributos de seu componente Rect Transform:
  • Âncora (ícone destacado em verde na imagem a seguir): selecione a opção Stretch Stretch;
  • Left, Top, Right e Bottom = 0.
Inicialmente, por encontrar-se na última posição dos elementos hierarquicamente subordinados a Canvas e pertencer à mesma camada de seus “irmãos”, ColliderProximaEtapa ocupará a parte posterior da imagem exibida em tela. Somado a isso, por não ter um sprite atrelado a seu componente Image e pelas alterações que acabamos de realizar sobre os atributos de Rect Transform, o resultado é uma tela em branco, como evidenciado ao se observar a exibição da aba Game.

O intuito de termos implementado ColliderProximaEtapa, ao contrário do que pode parecer até o momento, é o de não aparecer aos olhos do jogador, mas, ainda assim, influenciar na interação entre o player e o game ao captar seus cliques (ou toques na tela). Para tal, altere o valor do atributo Color de seu componente Image para a cor composta a seguir:
  • R (red, vermelho) = 255;
  • G (green, verde) = 255;
  • B (blue, azul) = 255;
  • A (alpha, canal de opacidade ou transparência) = 0.
Ainda na aba Inspector, clique sobre o botão Add Component e adicione um componente de tipo Event Trigger ao objeto:


Após a inserção, clique sobre o botão Add New Event Type e selecione a opção PointerClick, conforme exemplificado a seguir:


Agora, ao receber cliques, o objeto ColliderProximaEtapa poderá responder a comandos, mesmo estando com sua representação gráfica transparente. Iremos indicar ao Unity qual será o comando a ser realizado em caso de clique sobre o GameObject ao realizarmos a seguinte sequência de ações:
  • Clique sobre o ícone “mais” (+), destacado em verde na imagem a seguir;
  • Na caixa presente logo abaixo de Runtime Only, indique ao Unity como referência o objeto ControladorFase;
  • No menu suspenso ao lado de Runtime Only, selecione a opção ControllerFase e, em seguida, ProximaEtapa().
Dessa forma, a função ProximaEtapa será acionada, de fato, no momento em que esperamos que ela seja: assim que o jogador finalizar a leitura da mensagem do paciente e quiser avançar, clicando sobre a tela.

Ao término das intervenções sobre o GameObject, realize a desativação de ColliderProximaEtapa, deixando a caixa de seleção na parte superior de Inspector (ao lado do nome do objeto) vazia.

Por fim, na aba Hierarchy, selecione ControladorFase e, na aba Inspector, dentro da área dedicada ao componente Controller Fase, informe ao Unity o objeto que será representado pela variável Objeto Collider Canvas; no caso, ColliderProximaEtapa:

Depois de tantas intervenções, que tal simularmos a execução do game para vermos como o fluxo de interações iniciais está ocorrendo? Para tal, vá até a aba Game e clique sobre o ícone do botão Play:

As falas apresentadas nos campos correspondentes derivam diretamente do conteúdo que iremos introduzir nos vetores de strings Fala Paciente e Fala Doutor, presentes em Controller Fase, conforme podemos notar ao selecionarmos ControladorFase e observarmos o conteúdo da aba Inspector:


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

Hoje realizamos interessantes intervenções no projeto, tanto a nível de código quanto via editor do Unity, permitindo avançarmos um pouco mais no processo de interação inicial entre paciente e médico.

Nas próximas etapas de nosso projeto, daremos sequência às intervenções que permitirão finalizarmos a elaboração das interações iniciais para, enfim, começarmos a configurar a interação entre a introdução do jogo e o núcleo de ação dos desafios.

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).