GameDev

Aprendendo a programar jogos em Unity: Colliders misteriosos e parâmetros de um Rigidbody

Investigaremos e trataremos os fatores que levaram o modelo tridimensional do doutor à queda no cenário.

em 11/08/2024
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Em nosso encontro anterior, ao melhor estilo “videocassetadas”, pudemos presenciar o baita tombo que Doutor Tratanildo acabou levando em nosso cenário. Vale a pena ver de novo:

A partir da cômica simulação, que evidenciou a concreta aplicação de elementos do sistema de física do Unity em nossos GameObjects, algumas questões foram levantadas, envolvendo alguns aspectos do uso de Box Colliders e, também, sobre a influência que o motor de física da ferramenta exerce sobre valores de parâmetros do componente Transform. Essas questões serão analisadas no texto de hoje.

Se esta é a primeira vez que você acessa nossa série, não se acanhe e sinta-se convidado a juntar-se a nós em um divertido processo de aprendizado. Você terá a oportunidade de aprender mais sobre como a ferramenta Unity pode ajudar a tirar do papel os jogos que sempre sonhou em tornar realidade.

Mesmo se você não tiver experiências prévias no desenvolvimento de jogos, esta é uma ótima oportunidade para aprender, a partir do primeiro tópico da série, desde os conceitos básicos de instalação e configuração da ferramenta em seu computador até a construir, de fato, jogos de diversos estilos, por meio da elaboração de projetos práticos, tais como os referentes aos jogos Forest Ping Pong, Motorista da Pesada e, claro, Consultório do Doutor Tratanildo.

Venha conosco nesta caminhada rumo a novos conhecimentos!

Pesquisando elementos

A partir dos testes que realizamos em nosso último encontro, pudemos perceber uma interessante interação entre Doutor_rindo e BaseCama.

Em relação ao primeiro, faz todo sentido a presença da ação da gravidade sobre o GameObject devido à presença dos componentes Box Collider e Rigidbody que adicionamos ao objeto. Porém, se revisarmos as atividades que realizamos anteriormente, não adicionamos nenhum componente do tipo Box Collider para BaseCama. Então, por que Doutor_rindo sofre influência de BaseCama ao cair?

Para revelarmos a causa da presença desse misterioso componente em um objeto, vamos abrir o Unity Hub e clicar 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, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene.

Com a referida cena aberta, na aba Hierarchy, note que há a presença de uma caixa de pesquisa, em destaque na imagem a seguir:


Essa caixa de pesquisa apresenta um comportamento bem interessante, pois ela permite que localizemos GameObjects tanto pelo seus nomes quanto pelo nome de determinado componente que o objeto apresente em sua estrutura.

Por exemplo, se digitarmos “boxcollider” (sem as aspas) na caixa de pesquisa, será exibida uma listagem na aba Hierarchy de todos os elementos em cena que contêm componentes do tipo Box Collider:


É interessante notar como o Unity representa os elementos apresentados na lista de pesquisa da aba Hierarchy na janela da aba Scene. Na imagem a seguir, repare que apenas os itens listados na pesquisa realizada aparecem coloridos, facilitando a localização rápida de um elemento do cenário.

Vamos clicar, então, no item referente ao objeto BaseCama. Note a presença de um componente do tipo Box Collider em destaque na aba Inspector:

De fato, o elemento presente influenciou no comportamento de Doutor_rindo em sua queda. Mas, para sabermos como ele foi parar ali, vamos voltar a atenção novamente aos elementos pesquisados da aba Hierarchy:


Dentre os objetos que contêm Box Colliders em suas listas de componentes, os GameObjects destacados em vermelho na imagem anterior foram criados por nós diretamente no Unity por meio do comando “3D Object > Cube” ou clonados de outro objeto criado originalmente dessa forma. Já os demais objetos receberam a adição posterior de Box Colliders de forma manual.

Os GameObjects que são inseridos em cena com base nos elementos tridimensionais padrão do Unity (Cube, Sphere, Capsule, Cylinder, dentre outros) já recebem a adição automática de Colliders que correspondem ao formato do objeto em questão, sendo acrescidos, por exemplo, Box Colliders para cubos e Sphere Colliders para esferas.

Por isso, pudemos notar a presença de outros curiosos objetos portadores de Box Colliders na lista da aba Hierarchy, como Teto.

Solucionado o primeiro mistério, limpe o conteúdo presente na caixa de pesquisa da aba Hierarchy para avançarmos em uma outra questão bem interessante.

Restrições de rotação em um Rigidbody

Algo bem visível durante a queda de Doutor_rindo no cenário foi a alteração dinâmica dos valores de diferentes parâmetros de seu componente Transform, como os que envolvem o posicionamento e a rotação do elemento.

Essas modificações de valores ocorrem pois são uma das formas de o motor de física do Unity agir sobre os objetos de forma realística, alterando o posicionamento e a rotação com base na geometria do Collider de um objeto e, também, com base em características configuradas de seu Rigidbody, como por exemplo a massa (Mass) e os atritos posicional (Drag) e rotacional (Angular Drag) do elemento em cena.


Embora isso seja útil para objetos que necessitam ter reações físicas em cena condizentes com o ambiente (ex.: uma bola chutada em um jogo de futebol), em determinadas situações é interessante restringirmos certas modificações de valores de posição e de rotação dos objetos para evitarmos que aconteça o que ocorreu com Doutor_rindo, que acabou por tombar com a cara no chão ao interagir com outros objetos.

Essas restrições podem ser aplicadas de diversas formas, como por exemplo por meio de scripts, porém uma das mais fáceis abordagens para se aplicar esse tipo de restrição a um GameObject é por meio dos atributos do grupo Constrains de seu componente Rigidbody:


Os atributos Freeze Position X, Y e Z restringem a modificação, por ação do motor de física do Unity, dos parâmetros Position X, Y e Z do componente Transform do objeto, respectivamente. Comportamento semelhante é apresentado pelos atributos Freeze Rotation X, Y e Z, que impedem essa mesma ação para os parâmetros Rotation X, Y e Z do componente Transform.

Para vermos essas restrições em ação, iremos submeter novamente o glorioso objeto Doutor_rindo a algumas quedas experimentais. Para isso, selecione-o na aba Hierarchy e, na aba Inspector, altere o valor do parâmetro Position Y de seu componente Transform para 4.

Sem realizar nenhuma outra modificação, vamos simular a execução do game, indo à aba Game e pressionando o ícone do botão Play:

Por enquanto, a queda é bem parecida com o observado no encontro anterior, certo? Isso ira mudar em breve. Interrompa a execução da simulação, selecione novamente Doutor_rindo e, na aba Inspector, deixe selecionados os itens Freeze Rotation X e Z.


Agora, simule novamente a execução e veja o interessante comportamento do objeto:

Pois bem, mesmo estando posicionado sobre a beirada de BaseCama, nosso querido (e, a essa altura, todo machucado) Doutor Tratanildo não cairá mais de cara no chão. Bom para ele!

Finalize a execução da simulação do projeto e retorne à aba Scene. Vamos posicionar novamente Doutor_rindo no cenário próximo ao joystick de controle do leito, modificando os valores dos parâmetros de seu componente Transform conforme descrito a seguir:
  • Position X = 12.45, Y = 0, Z = -12.9.
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

Nosso próximo encontro será muito especial, pois iremos comemorar o 50º texto da série Aprendendo a programar jogos em Unity! Vamos recordar diversos conceitos que vimos durante esta agradável caminhada de aprendizado, além de vislumbrarmos um pouco do que ainda está por vir.

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

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. Escrevemos sob a licença Creative Commons BY-SA 3.0 - você pode usar e compartilhar este conteúdo desde que credite o autor e veículo original.