Aprendendo a programar jogos em Unity: colisões entre pílulas e uma nova paciente no consultório

Daremos sequência ao processo de construção dos desafios finais do game.

em 27/09/2026
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Dando sequência ao processo que iniciamos em nosso encontro anterior, continuaremos a configurar os desafios definitivos de nosso jogo, corrigindo comportamentos relacionados à concessão de pílulas ao labirinto e adicionando mais uma paciente à lista de potenciais clientes de Tratanildo Doencita.

Se esta é a primeira vez que você tem contato com conteúdos de nossa série, sinta-se especialmente convidado a conhecer mais sobre nosso projeto prático de aprendizado sobre desenvolvimento de jogos digitais, por meio da elaboração de games de diferentes estilos gráficos e de gameplay.

Utilizando a ferramenta Unity como apoio no processo didático, estamos desbravando diferentes métodos, técnicas e procedimentos envolvidos no processo de criação de aventuras digitais. A cada encontro, aprendemos e aplicamos variados conceitos práticos, que também são adotados no processo de programação de jogos das mais variadas equipes de desenvolvimento do mundo todo.

A partir do primeiro tópico da série, são abordadas desde as etapas que envolvem a instalação e a configuração da plataforma Unity em nossos computadores até os passos em que, de fato, colocamos a mão na massa para tirar do papel os elementos que formam os desafios de um game: cenários, personagens, adversários, itens, regras e fases.

Por meio dos projetos práticos que elaboramos, conseguimos observar e experimentar elementos que são úteis ao processo de criação de games, replicáveis aos projetos pessoais que você tenha vontade de desenvolver. Mesmo sem experiências prévias de programação de jogos ou de sistemas, é possível aprender os conceitos abordados, pois, nesta série, as etapas de programação e de configuração dos elementos são sempre acompanhadas de exemplos e de explicações sobre os conceitos abordados.

Até a data de publicação deste texto, já concluímos a construção de dois games bidimensionais: a “homenagem florestal” ao clássico Pong (Atari, 1972), Forest Ping Pong, e o platformer rodoviário Motorista da Pesada, inspirado no arcade japonês City Connection (Jaleco, 1985). No momento, estamos trabalhando no projeto do game 3D Consultório do Dr. Tratanildo: trata-se de um curioso puzzle ambientado em um consultório médico tridimensional, cujos conceitos de gameplay foram construídos com inspiração em clássicos como Dr. Mario (Nintendo, 1990) e Pac-Man (Namco, 1980). 


Recomendo fortemente acompanhar as etapas de elaboração dos três jogos, a partir dos textos destacados no índice da primeira entrada da série. É possível, inclusive, experimentar os dois primeiros  games diretamente de seu navegador, por meio de links nos últimos textos de seus projetos.

Se em seu coração bate a vontade de tirar do papel suas próprias aventuras digitais, não perca mais tempo: junte-se a nós nesta jornada, repleta de novos conhecimentos e de muita diversão!

Mitigando colisões

A partir do momento em que elaboramos novos labirintos aos novos pacientes de Tratanildo Doencita e testamos o funcionamento do jogo, foi possível verificar que, sob determinadas circunstâncias, as configurações que adotamos para o fornecimento de pílulas pode causar problemas de colisão graves, incluindo a possibilidade de “entalarmos” medicamentos nas paredes do labirinto.

Esse problema ocorre devido ao fato de indicarmos ao game coordenadas fixas para o fornecimento das pílulas, por meio dos parâmetros Posicao Inicial Pilulas que configuramos via script controlador de fases. Caso uma pílula (ou mesmo um obstáculo) esteja presente na mesma posição em que um novo objeto for instanciado dentro do labirinto, inevitavelmente uma colisão irá ocorrer, podendo ocasionar comportamentos inesperados por parte dos objetos ali presentes.

Para reduzir a probabilidade de ocorrerem situações como esta em nosso projeto, vamos adicionar ao script responsável pela gestão do labirinto comandos para verificação de colisões nos locais em que as novas pílulas surgirão no cenário, além de instruções para que haja uma sutil movimentação das pílulas no cenário, assim que elas forem introduzidas em cena.

Vamos, então, abrir o projeto para edição e iniciarmos as intervenções. 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 para iniciarmos as intervenções.

Na aba Project, abra a pasta Assets e, em seguida, Scripts. Localize o ícone do script MontaLabirinto e clique duas vezes sobre o item, para iniciarmos sua edição no Visual Studio.

Localize a função ColocarPilulaNoLab e substitua a última linha de códigos (pilulasCriadas[pos].SetActive(true);)  bloco de comandos a seguir:

        //Validação da posição da pílula (tratamento de colisões)
        bool colisao = true;
        Vector3 posPilula = pilulasCriadas[pos].transform.position;
        while (colisao)
        {
            if (Physics.OverlapSphere(posPilula, 0.5f).Length > 0)
                posPilula -= new Vector3(0, 0, 0.5f);
            else 
                colisao = false;
        }
        pilulasCriadas[pos].transform.position = posPilula;

        // Aplicar uma pequena força para movimentar a pílula
        Vector3 forcinha = new Vector3(Random.Range(-50f, 50f), 0, Random.Range(-50f, 50f));
        pilulasCriadas[pos].GetComponent<Rigidbody>().AddForce(forcinha);

        // Ativar pílula
        pilulasCriadas[pos].SetActive(true);

A função Physics.OverlapSphere permite a verificação de possíveis colisões em um ponto no ambiente 3D da cena do Unity, bastando informar a ela qual é a posição desejada (em termos globais) e o raio da esfera de análise de colisões a ser considerado.

Em nossa implementação, coletamos a posição global da pílula criada e armazenamos na variável temporária posPilula, passando-a como parâmetro de Physics.OverlapSphere, considerando um raio de referência de 0,5 unidade, aproximadamente metade do raio da pílula. Se, dentro desse raio, for detectado algum tipo de potencial colisão (por exemplo, pela presença de outra pílula), novo teste é realizado em uma posição afastada em -0,5 unidade no eixo Z.

Esses testes são repetidos até que se localize uma posição sem colisões, apto a receber a nova pílula no labirinto. Localizada a posição global definitiva para inserção do novo objeto, pilulascriadas[pos] recebe o valor corrigido como sua nova posição no labirinto.

Adicionalmente, para cada nova pílula de saúde introduzida no labirinto, aplicaremos uma força randômica (entre -50 e 50) nos eixos X e Z, para que haja uma pequena movimentação do objeto no ato de sua inserção no cenário. Somente após todas as etapas concluídas é que o GameObject em questão será ativo no cenário.

As novas intervenções em código diminuem significativamente a chance de ocorrerem colisões graves, que cheguem a impedir a utilização das pílulas nos tratamentos dos pacientes. Mesmo assim, é interessante realizarmos ajustes em outros parâmetros do projeto para reduzir ainda mais esta probabilidade.

Salve o script e retorne ao Unity para concluirmos as demais intervenções no editor do Unity.

Subindo os muros

Um dos problemas ocasionados por colisões indevidas entre pílulas recém-introduzidas no labirinto envolve os obstáculos dinâmicos que configuramos para cada paciente e a tampa transparente, representada por LabTampaTransparente, que prende os medicamentos dentro do ambiente designado.

Quando situações de colisão na criação de novas pílulas ocorrem próximo às muretas internas do labirinto, medicamentos podem ficar prensados entre a tampa e o obstáculo, impossibilitando seu uso.

Mesmo reduzindo o risco de que isso ocorra por meio das intervenções em código, é importante ajustarmos os parâmetros do jogo para que, em situações assim, o medicamento possa se soltar e voltar aos caminhos do labirinto.

Na aba Hierarchy, localize o GameObject Labirinto e, por meio da opção correspondente na aba Inspector, ative o objeto temporariamente. Expanda a lista de elementos subordinados a Labirinto e selecione simultaneamente LabParede1, LabParede2, LabParede3 e LabParede4.

Na aba Inspector, localize o parâmetro Scale Y, do componente Transform dos quatro GameObjects, e altere seu valor para 4, conforme imagem a seguir.

Em seguida, selecione o objeto LabTampaTransparente e, na aba Inspector, modifique o valor do parâmetro Position Y de seu componente Transform para 3.25.

Ao “subirmos os muros” do labirinto sem alterarmos as dimensões dos obstáculos internos, caso uma pílula vier a parar em cima de um obstáculo, terá como voltar ao caminho natural do labirinto.

Por falar em muros altos, embora o labirinto seja uma representação lúdica do interior dos corpos dos pacientes, até o momento mantivemos a presença de sombras e dos efeitos de luz aplicados a elementos externos da cena. Como as paredes laterais do labirinto agora são maiores, a sombra que elas projetam sobre o labirinto também aumenta proporcionalmente, o que pode prejudicar uma boa visualização das pílulas e dos agentes de doenças, especialmente no lado direito do labirinto.

Vamos remover a projeção de sombras para as quatro paredes laterais do labirinto: selecione novamente os quatro objetos e, na aba Inspector, altere o valor do atributo Lightning Cast Shadows de seus componentes Mesh Renderer para Off.

Após realizarmos as intervenções necessárias sobre os elementos subordinados a Labirinto, volte a selecionar esse objeto e desabilite-o, por meio da opção correspondente na aba Inspector.

Uma nova paciente

Após tantos ajustes serem implementados em nosso projeto, é chegado o momento de recepcionarmos mais uma ilustre paciente no glorioso consultório virtual de Tratanildo Doencita. A nova enferma do jogo está sofrendo com dores generalizadas no corpo, após cair de uma escada no dia anterior à visita.

Como alusão ao causador de tanto sofrimento, os obstáculos do labirinto se assemelham a uma pequena escada. A parte inferior do labirinto concentra agentes de doenças de três tipos diferentes, algo inédito no game até o momento.

Para que a nova paciente seja introduzida à lista de enfermos de nosso game, na aba Hierarchy, clique sobre o objeto ControladorFase. Via aba Inspector, vamos realizar as seguintes intervenções em atributos de seu componente ControllerFase:
  • Tipo Paciente: amplie o tamanho do vetor para 6.
    • Element 5: conceda o valor 6 (corresponde ao item skin_woman, presente em Estilos Visuais Pacientes).
  • Fala Paciente: amplie o tamanho do vetor para 6.
    • Element 5: conceda o seguinte texto, sem as aspas:
      “Doutor, caí de uma escada ontem e sofri um tombo bem feio. Meu corpo inteiro dói, não sei mais o que fazer. Por favor, me ajude!”
  • Fala Doutor: amplie o tamanho do vetor para 6.
    • Element 5: conceda o seguinte texto, sem as aspas:
      “Que perigo, jovem! E você ainda consegue sorrir, mesmo estando toda dolorida?! Vou te examinar e determinar quais pílulas utilizaremos.”
  • Fala Final: amplie o tamanho do vetor para 6.
    • Element 5: conceda o seguinte texto, sem as aspas:
      “Nossa, estou me sentido bem melhor! Meu sorriso era de nervoso, mas, agora, é puramente de alívio! Obrigada!”
  • Tempo Max Tratamento: amplie o tamanho do vetor para 6.
    • Element 5: conceda o valor 150.
  • Posicao Monstros Azuis: amplie o tamanho do vetor para 4.
    • Element 3: X = 0, Y = 8.25, Z = 5.
  • Posicao Monstros Roxos: amplie o tamanho do vetor para 6.
    • Element 4: X = -7, Y = -7, Z = 5;
    • Element 5: X = 2.5, Y = 4, Z = 5.
  • Posicao Monstros Amarelos: amplie o tamanho do vetor para 4.
    • Element 3: X = 2.5, Y = -8.25, Z = 5.

  • Posicao Obstaculos: amplie o tamanho do vetor para 37 (31 preexistentes + 6 para o labirinto da nova paciente).
    • Element 31: X = 5, Y = 1.5, Z = 5;
    • Element 32: X = 1.5, Y = -7.5, Z = 5;
    • Element 33: X = -2, Y = -4, Z = 5;
    • Element 34: X = -5.5, Y = -1.5, Z = 5;
    • Element 35: X = -9, Y = 1, Z = 5;
    • Element 36: X = -0.5, Y = 6.5, Z = 5.
  • Dimensao Obstaculos: amplie o tamanho do vetor para 37 (31 preexistentes + 6 para o labirinto da nova paciente).
    • Element 31: X = 1, Y = 16, Z = 5;
    • Element 32: X = 1, Y = 4, Z = 5;
    • Element 33: X = 1, Y = 4, Z = 5;
    • Element 34: X = 1, Y = 4, Z = 5;
    • Element 35: X = 1, Y = 4, Z = 5;
    • Element 36: X = 10, Y = 1, Z = 5.
Aproveitando a realização dos ajustes relacionados à colisão entre pílulas, vamos padronizar para todos os pacientes a aparição das novas pílulas no canto superior esquerdo do labirinto, alterando os valores do conjunto de atributos Posicao Inicial Pilulas:
  • Element 0: X = 8, Y = 8;
  • Element 1: X = 8, Y = 4.
Com todos os ajustes realizados, experimente testar o game, indo à aba Game e clicando sobre o ícone do botão Play. Note como as intervenções aplicadas hoje modificam a forma de jogar as fases com os demais pacientes, e experimente a dinâmica dos agentes multicoloridos, introduzida no jogo pela paciente recém-configurada.

Ao final dos testes, interrompa a execução do jogo, clicando novamente no ícone do botão Play e retornando à aba Scene. 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

Avançamos mais uma etapa do processo final da construção de Consultório do Dr. Tratanildo. Já contamos com seis pacientes configurados, aptos a serem tratados pelo melhor médico do universo virtual. Além disso, refinamos mais um pouco as mecânicas de jogo, melhorando aspectos relacionados às colisões entre pílulas de saúde.

Em nosso próximo encontro, introduziremos os últimos pacientes à nossa aventura e, finalmente, concluiremos a construção de nosso tão sonhado jogo tridimensional.

Nos encontraremos novamente no dia 4 de outubro. 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).