Aprendendo a programar jogos em Unity: corrigindo bugs em diferentes módulos do game

Daremos mais um passo essencial para a conclusão da construção de nosso game tridimensional.

em 30/08/2026
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Após configurarmos, em nosso encontro anterior, recursos para pausar o game e para avançar adequadamente às telas de vitória e de derrota, corrigiremos hoje diversos bugs, relacionados a menus e a outros módulos de nosso projeto.

Caso esta seja a primeira vez que você entra em contato com conteúdos de nossa série, não se acanhe e junte-se a nós para conhecer mais sobre o fascinante mundo do desenvolvimento de jogos digitais.

Por meio da elaboração de projetos práticos de programação, a cada encontro aprendemos um pouco mais sobre como ferramentas como a Unity podem nos auxiliar na criação de games de estilos gráficos e de gameplay distintos.

A partir do primeiro tópico da série, estamos trabalhando em projetos que envolvem os mais variados passos da concepção de aventuras digitais. Abordamos desde a instalação e a configuração da ferramenta em nossos computadores, até a elaboração e a configuração dos elementos que fazem parte dos desafios propostos pelo game, tais como seus personagens, adversários, objetos, fases e regras.

Os conceitos abordados em nossos encontros são apresentados por meio de exemplos aplicados aos projetos. Dessa forma, é possível replicar os aprendizados realizados em seus projetos pessoais, tomando como base as atividades realizadas durante a elaboração dos games.

Até o momento, já concluímos a construção de dois games 2D: Forest Ping Pong, uma homenagem ao clássico Pong (Atari, 1972), e Motorista da Pesada, um platformer inspirado no arcade japonês City Connection (Jaleco, 1985).

Atualmente, estamos elaborando Consultório do Dr. Tratanildo, um puzzle tridimensional ambientado em um curioso consultório médico. Seus aspectos de gameplay são inspirados, dentre outros jogos, em clássicos dos anos 1980 e 1990, como Dr. Mario (Nintendo, 1990) e Pac-Man (Namco, 1980).


Vale muito a pena conhecer sobre o processo de elaboração dos três jogos de nossa série, acessando os textos correspondentes a cada projeto, por meio do índice disponibilizado na primeira entrada da série. Em relação aos dois primeiros games, é possível experimentá-los diretamente de seu navegador, por meio de links compartilhados nos últimos textos relacionados a eles.

Fica aqui o convite: caso você tenha a vontade de tirar do papel os games que sempre sonhou em tornar realidade, não perca mais tempo e junte-se a a nós em uma caminhada repleta de novos conhecimentos e de muita diversão!

Medicina em dobro

Uma das etapas mais trabalhosas do processo de elaboração de um game consiste na maratona de sessões de teste do jogo, em busca da observação de bugs e outros comportamentos estranhos.

Como estamos acostumados a testar nosso jogo após a implementação de novas funcionalidades, não raramente acabamos por encarar situações curiosas, como a aparição de um “clone” de Tratanildo Doencita após a conclusão do tratamento de um paciente, sob determinadas condições.

Na verdade, a aparição de um novo médico em cena não trata-se de um milagre da medicina: trata-se, na verdade, do resultado de um bug que ocorre durante a etapa de concessão de pílulas ao enfermo.

Durante a etapa de pré-visualização do labirinto, caso as pílulas concedidas erradiquem os agentes de doenças, não há a correta configuração das instâncias adequadas de Tratanildo no cenário, sendo ativadas tanto a correspondente ao momento de diálogo com o paciente, quanto a utilizada durante a etapa de coleta de pílulas no consultório.

Para que possamos eliminar esse comportamento estranho de nosso jogo, vamos abrir o projeto para edição. No Unity Hub, clique duas vezes sobre o item referente ao projeto Consultório do Dr. Tratanildo. Na interface inicial do Unity, na aba Project, abra a pasta Assets e, em seguida, Scenes. Clique duas vezes sobre o ícone da cena ConsultorioScene.

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.

A correção do bug envolverá a verificação de uma condição adicional pelo game, durante a etapa de pré-visualização do labirinto, ao concedermos pílulas ao paciente.

Normalmente, após os dois segundos de pré-visualização, o jogo volta a conceder o controle do médico ao jogador, para que ele escolha explorar o labirinto ou inicie o manejo da inclinação do leito. Adicionaremos códigos no script para que essa concessão do controle só ocorra caso ainda não tenha sido concluído o tratamento.

Localize a função ProximaEtapa e, dentro da estrutura condicional switch (etapaAtual), introduza a seguinte linha de código logo após a condição referente ao valor “Tratamento”:

                etapaAtual = "CarregandoDialogoFinal";

Em seguida, localize a Coroutine MostrarLabirintoPacientes. Dentro das chaves da função, substitua as últimas linhas de código conforme segue:

De:

        if (controlarLabirinto == false)
            TransicaoParaTratamento(ehNovoTratamento);

Para:

        if ((controlarLabirinto == false) && (etapaAtual != "CarregandoDialogoFinal"))
            TransicaoParaTratamento(ehNovoTratamento);

Com as modificações realizadas, assim que a função ProximaEtapa for acionada (o que ocorre, por exemplo, ao se esgotarem os agentes de doenças no labirinto), a variável etapaAtual receberá um valor que, com as novas verificações, impedirá o prosseguimento do jogo para a etapa de exploração do labirinto, forçando o game a seguir para o estado correto (conclusão do tratamento).

Jogo sem fim

Outro comportamento indesejado de nosso game ocorre ao tentarmos finalizar o game utilizando o mouse para clicarmos no botão “Voltar à tela inicial”, exibido na tela de vitória do jogo:

Diferentemente do que já ocorre durante a exibição da tela de game over, o Collider que introduzimos em um objeto subordinado ao Canvas para captar cliques na tela e avançarmos durante a etapa de conversas entre médico e pacientes não está sendo desabilitado. Essa falha acabou por criar uma situação em que o botão está presente e selecionado, mas, com a presença de uma barreira invisível, só é possível acioná-lo no momento com o teclado ou com controles de videogame.

Para corrigir essa situação, ainda com o script ControllerFase em evidência, localize a função AvancarProximaFase. Dentro do conjunto de códigos que são executados quando se vence os desafios, introduza a seguinte linha de código logo após o comando de concessão do valor “GanhouTudo” à variável etapaAtual:

            objetoColliderCanvas.SetActive(false);

Com esse ajuste, não teremos mais problemas para voltarmos à tela inicial, após concluirmos o jogo utilizando o mouse como parte da experiência de interação com o game.

Salve o script, minimize o Visual Studio e retorne ao editor do Unity para darmos sequência às intervenções de hoje.

Opções conflitantes

Ao implementarmos, em encontros anteriores, o menu de opções de dificuldade e de controles, realizamos ações em códigos para guardar as preferências do jogador e restaurá-las em novas sessões de jogo. Porém, o game apresenta um comportamento estranho, ignorando especificamente a seleção de métodos de controle diferentes de teclado e mouse ao se realizar a primeira visita à tela de opções.

Esse bug ocorre devido a uma especificidade de nossa implementação do script AjusteOpcoes. Para captar e atualizar o valor dos controles e dos níveis de dificuldade selecionados pelo jogador, utilizamos uma referência ao objeto selecionado no momento (objeto toggleClicado), conforme podemos recordar pela imagem a seguir.

Ao mesmo tempo, determinamos que o botão responsável pela exibição da tela de opções, assim que acionado, indicaria ao jogo que a opção correspondente ao controle de teclado e mouse deveria ser selecionado para navegação do menu utilizando teclado ou controle de videogame.

Como efeito colateral das escolhas que realizamos, ao serem exibidos pela primeira vez, os Toggles da tela de opções recebem os valores adequados (caixa de seleção acionada ou vazia, dependendo dos valores em PlayerPrefs) e acionam a função AtualizarValores. Como, no momento inicial da exibição da tela, o objeto selecionado é OpcaoMouse, o jogo entende que é essa a opção a ser levada em conta, referente ao tipo de controle a ser utilizado.

Existem diferentes formas para solucionar essa questão, por exemplo, utilizando outras referências em código que não a do objeto atualmente selecionado. Porém, para simplificar a correção, vamos simplesmente mudar o elemento a ser selecionado, quando da exibição da tela de opções do game.

Na aba Hierarchy, selecione o objeto BotaoOpcoes. Na aba Inspector, localize seu componente atrelado Button e, dentro do grupo de opções correspondente à ação On Click, modifique a entrada correspondente à seleção do Toggle OpcaoMouse, conforme segue:
  • Objeto referenciado: Voltar, subordinado ao GameObject TelaOpcoes;
  • Ação a ser realizada: Button.Select.
Com essa simples alteração, não teremos mais problemas relacionados às opções do jogo, pois, dentro da estrutura do script responsável pela atualização dos valores das preferências de controles e de dificuldade do game, caso o objeto selecionado não seja um dos Toggles referenciados, nada ocorrerá.

Não se esqueça de salvar a cena (menu File, Save) e o projeto (menu File, Save Project) antes de fechar o Unity.

Próximos passos

Ao finalizarmos as intervenções de hoje, corrigimos bugs que poderiam prejudicar severamente o andamento do game, tanto para quem escolher jogá-lo utilizando teclado e mouse, quanto por meio do uso de joysticks de videogames.

Em nossos próximos encontros, construiremos a tela de créditos do jogo e aplicaremos ajustes pontuais  ao projeto, relacionados ao cenário, a efeitos sonoros e (alerta de spoiler!) às madeixas de um renomado médico do mundo virtual. Estamos mais próximos da conclusão de nosso projeto do que nunca!

Nos encontraremos novamente no próximo dia 6 de setembro. Até mais! Fique ligado sempre nas novidades do 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).