Aprendendo a programar jogos em Unity: pacientes na cama e informações na tela

Com o posicionamento do modelo tridimensional do paciente sobre a cama, movimentaremos simultaneamente o labirinto e os enfermos.

em 02/02/2025
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Após realizarmos, em nosso encontro anterior, a codificação de novos papeis ao script de configuração do labirinto, iremos voltar nossa atenção ao ambiente do consultório, deitando o modelo do paciente sobre a cama do leito hospitalar.

Se esta for a primeira vez que você lê conteúdos de nossa série, aproveite para juntar-se a nós em uma divertida trilha de aprendizagem sobre diferentes conceitos do mundo do desenvolvimento de games. 

Em nossa série, estamos produzindo jogos de diferentes estilos por meio da elaboração de projetos práticos de programação. No momento, estamos nos dedicando ao desenvolvimento de Consultório do Dr. Tratanildo, um game ambientado em um consultório médico tridimensional, cujas características de gameplay prestam homenagens a diferentes clássicos dos videogames, como Dr. Mario e Pac-Man.


Mesmo se você nunca teve a oportunidade de ler algo sobre criação e desenvolvimento de games, não se preocupe: A partir do primeiro texto da série, abordamos desde os conceitos mais básicos, como a instalação e configuração da ferramenta em nossos computadores, até os conteúdos que, de fato, vão nos auxiliar a compor nossas aventuras, tais como a inserção e configuração de elementos multimídia nas cenas de jogo, a definição das metas e regras do jogo e a programação dos comportamentos dos personagens e dos itens nas fases.

Não se acanhe! Venha conosco para que, juntos, possamos seguir nesta caminhada rumo a novos conhecimentos!

Ocupando o leito

Depois de realizarmos diferentes alterações em relação ao labirinto, sua composição interna e os scripts que influenciam no surgimento de elementos e na interação entre medicamentos e agentes de doenças, é chegada a hora de voltarmos nossa atenção ao consultório, pois a experiência do game não se restringe apenas ao labirinto.

Para retomarmos as interações relativas ao nosso ambiente tridimensional, que tal começarmos introduzindo a representação do modelo do paciente sobre a cama do leito hospitalar? Manteremos duas “cópias” do paciente em cena: a que inserimos anteriormente, apta a caminhar pelo cenário, e a que iremos posicionar sobre a cama hoje, que será exibida em tela apenas nos momentos em que doutor Tratanildo Doencita estiver realizando seus tratamentos médicos com as pílulas de saúde.

Para tal, iremos abrir nosso 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 editor, na aba Project, abra a pasta Assets, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene.

Na aba Hierarchy, selecione o GameObject Leito, subordinado a CenarioFixo. Na aba Inspector, podemos notar que o componente Controller Mov_Labirinto, que introduzimos em um de nossos encontros anteriores, está ativo, influenciando na movimentação de todos os objetos subordinados a Leito.

Como desejamos que o paciente, após deitar-se sobre a cama, sofra a mesma inclinação que o conjunto do leito hospitalar sofrerá durante a realização dos tratamentos, devemos criar seu GameObject também subordinado a Leito. Para tal, na aba Project, abra as pastas Assets, Multimedia, 3D, Pacientes e, por fim, Modelo_base. Clique e arraste o ícone que representa o modelo do paciente (advancedCharacter) em direção à Leito, presente na aba Hierarchy.

Note que, logo após isso, um objeto de nome “advancedCharacter” será criado em cena, porém ainda sem os ajustes necessários para ser exibido satisfatoriamente sobre a cama:

Renomeie o novo GameObject inserido para “PacienteDeitado”, sem as aspas. Selecione-o e, na aba Inspector, modifique os valores dos atributos de seu componente Transform conforme listado a seguir:
  • Position X = -4, Y = 5.5, Z = 1;
  • Rotation X = 270, Y = 270, Z = 0;
  • Scale X, Y e Z = 50.
A representação do modelo do paciente já é exibida sobre a cama hospitalar, porém sem a aparência visual que nos acostumamos a utilizar para o outro objeto representante do paciente que está atualmente configurado em cena.

Vamos, então, deixar o paciente acamado com a mesma aparência de sua outra representação no cenário, para que seja passada ao jogador a impressão de se tratar de um só paciente em dois momentos distintos da aventura.

Na aba Hierarchy, selecione todos os objetos subordinados a PacienteDeitado, com exceção de seu esqueleto (Rig1). Na aba Inspector, altere o valor de Element 0 do atributo Materials de seus componentes Skinned Mesh Renderer para o material de nome “skin_womanAlternative”, conforme exemplificado a seguir:

Note que interessante: agora temos sobre a cama uma representação fiel de nosso paciente enquanto recebe o tratamento médico. Que tal vermos em ação o paciente se inclinando junto ao maquinário do leito e ao labirinto ao mesmo tempo? Para tal, vá à aba Game e clique sobre o ícone do botão Play:

Interrompa a simulação da execução, pressionando novamente o ícone do botão Play. Volte à aba Scene para realizarmos modificações adicionais ao nosso projeto.

HUD e informações na tela

Conforme vamos caminhando em frente no processo de desenvolvimento de nosso game, percebemos que os “núcleos” que o compõem vão amadurecendo, ficando mais próximos daquilo que queremos ao final da construção de nosso game. É o caso do núcleo do tratamento médico, composto pelos elementos do leito e os do labirinto, e do núcleo do consultório, composto pelos elementos cenográficos e personagens que caminham pelos corredores, como o médico e seus pacientes.

Algo que é importante termos em mente, ao desenvolver um game, é sobre como esses módulos se relacionam durante a execução do jogo. Uma das formas que adotamos durante o desenvolvimento dos jogos anteriores de nossa série para a troca de informações entre seus módulos por meio do uso de scripts controladores de fases ou mesmo da aventura como um todo, como é o caso do script Geral, cuja codificação foi iniciada por nós há alguns encontros.

Embora iremos continuar o desenvolvimento do referido script e de outros códigos auxiliares nos próximos encontros, já é interessante iniciarmos a construção de uma interface em tela que mostre ao jogador informações importantes de sua sessão de jogo que serão computadas e armazenadas por esses scripts, como o tempo restante para a conclusão do tratamento de um paciente, por exemplo.

Esse tipo de interface é conhecido pela sigla em inglês HUD (Heads-up display). No Unity, um HUD normalmente é constituído por objetos subordinados ao Canvas de uma cena, justamente pela necessidade de se exibir suas informações em sobreposição aos elementos do cenário.

Quem não se lembra do HUD que construímos para o game Motorista da Pesada, em que são exibidos os contadores de vidas e de tempo restante para cada fase?


Vamos começar, então, a construir a interface de nosso projeto, dando ênfase, por enquanto, às informações que deverão ser exibidas ao iniciarmos os tratamentos médicos. Na aba Hierarchy, clique com o botão direito sobre o GameObject Canvas e selecione a opção Create Empty. Conceda o nome “BarraInformacoesAcao”, sem as aspas, ao novo objeto criado.


A seguir, são listados os valores dos atributos de seu componente Rect Transform:
  • Âncora (ícone destacado em verde): Top Stretch;
  • Pivot X = 0.5, Y = 1;
  • Left , Right, Pos Y e Pos Z = 0;
  • Height = 200.
O novo objeto criado irá aglutinar diferentes GameObjects subordinados a si, que serão responsáveis pela exibição de informações importantes. Vamos começar pelo mostrador de tempo restante, que será composto por um ícone em formato de coração e um elemento de texto para apresentação do tempo em si.

Na aba Hierarchy, clique com o botão direito sobre BarraInformacoesAcao. No menu suspenso, selecione a opção UI e, por fim, Image. Conceda o nome “Coracao”, sem as aspas, ao novo objeto criado.


Selecione o novo objeto criado e, na aba Inspector, modifique os valores dos atributos de seu componente Rect Transform conforme indicado a seguir:
  • Âncora (ícone destacado em verde): Stretch Left;
  • Pivot X = 0, Y = 0.5;
  • Pos X, Top e Bottom = 50;
  • Width = 200;
  • Pos Z = 0.

Ainda na aba Inspector, em relação ao seu componente Image, modifique o valor do atributo Source Image para o sprite de nome “coracao” e deixe ativa a caixa de seleção do atributo Preserve Aspect.

Voltando à aba Hierarchy, clique com o botão direito novamente sobre BarraInformacoesAcao. No menu suspenso, selecione a opção UI e, por fim, Text. Conceda o nome “TempoRestante”, sem as aspas, ao novo objeto criado.


Esses serão os valores a serem concedidos aos atributos de seu componente Rect Transform, via aba Inspector:
  • Âncora (ícone destacado em verde): Stretch Left;
  • Pivot X = 0, Y = 0.5;
  • Pos X = 300;
  • Top e Bottom = 50;
  • Width = 500;
  • Pos Z = 0.

Em relação a seu componente Text, altere os seguintes valores para seus atributos:
  • Text: “00:00” (sem as aspas);
  • Character Font: selecione a opção de nome “Poppins-Bold”
  • Paragraph Alignment: horizontalmente à esquerda, verticalmente centralizado (itens destacados em azul na imagem a seguir);
  • Best Fit = verdadeiro (true);
  • Min Size = 10 e Max Size = 200.
Por fim, para concedermos um contraste legal entre as letras do contador de tempo e o cenário como um todo, iremos acrescentar um novo componente do tipo Outline ao objeto, por meio do botão Add Component da aba Inspector.

Esses são os valores a serem concedidos aos atributos do recém-inserido componente:
  • Effect Color: selecionar a cor branca sem transparência (R, G, B e A = 255);
  • Effect Distance X = 3, Y = -3.
Embora ainda não tenhamos configurado o comportamento do contador de tempo, vamos experimentar a execução do game para notarmos como ele será exibido em tela, indo à aba Game e clicando sobre o ícone do botão Play:

Interrompa a simulação da execução, clicando novamente sobre o ícone do botão Play e retornando à 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

Inserimos hoje o modelo tridimensional que representará o paciente durante a execução dos tratamentos médicos por Tratanildo Doencita em seu consultório. Além disso, iniciamos a construção do HUD de nosso jogo, introduzindo os elementos visuais para controle de tempo restante na parte superior da tela.

Em nossos próximos encontros, daremos sequência à construção do HUD do game e, também, ao processo de construção dos scripts de interação entre os diferentes módulos do jogo.

Nosso próximo encontro será no dia 9 de fevereiro. Até mais! Fique sempre ligado nas novidades do GameBlast!

Revisão: Davi Sousa
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 3.0).