Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Após implantarmos, em nosso encontro anterior, alterações no projeto que viabilizaram a criação de um modo de dificuldade elevado para o game, realizaremos hoje correções importantes em parâmetros relacionados ao módulo de física do Unity, visando reduzir a ocorrência de bugs envolvendo colisões entre o médico e os itens pertencentes a seu consultório.
Se esta for a primeira vez que você tem lê conteúdos de nossa série, considere-se especialmente convidado a conhecer mais sobre esta jornada de aprendizados práticos, mergulhando de cabeça no mundo do desenvolvimento de jogos digitais.
Por meio da elaboração de diferentes projetos, aprendemos a cada encontro sobre como ferramentas de desenvolvimento de jogos, como a Unity, podem nos auxiliar a tirar do papel games dos mais variados estilos gráficos e de gameplay.
A partir do primeiro tópico da série, abordamos desde a instalação e a configuração da ferramenta em nossos computadores, até tópicos envolvendo os mais variados métodos, técnicas e procedimentos utilizados por estúdios de desenvolvimento no mundo todo para a criação de jogos 2D e 3D. Colocando a mão na massa, encaramos desafios que envolvem a criação de fases, de regras e de metas para um jogo; a codificação de scripts controladores dos elementos em cenários; a elaboração de menus e de interfaces de interação entre o jogador e os desafios virtuais; dentre outros.
Até o momento, já produzimos dois jogos durante nossa jornada, de nomes Motorista da Pesada e Forest Ping Pong. São dois games 2D, cujos aspectos de gameplay remetem a clássicos dos arcades e dos videogames, como Pong (Atari, 1972) e City Connection (Jaleco, 1985).
O projeto em que estamos trabalhando atualmente chama-se Consultório do Dr. Tratanildo. Trata-se de um jogo ambientado em um consultório médico tridimensional, cujo gameplay mescla referências a jogos dos anos 1980 e 1990, como Dr. Mario (Nintendo, 1990), Pac-Man (Namco, 1980) e Tama (Time Warner Interactive, 1994).
Muitos dos conceitos abordados na concepção de um jogo acabam sendo válidos para os demais, por isso, recomendo fortemente que acompanhe, a partir do índice disponibilizado no primeiro texto da série, os passos realizados para a construção dos três games. Também é possível experimentar os dois primeiros jogos completos, diretamente de seu navegador, acessando os últimos textos relacionados a eles.
Se você tem a vontade de tirar do papel os games que sempre sonhou em tornar realidade, a hora é agora: prepare as malas e venha conosco em uma estrada repleta de novos conhecimentos e de muita diversão!
Em circunstâncias normais, nosso jogo funciona de forma bem adequada, permitindo ao jogador coletar as pílulas pelo cenário e utilizá-las para os tratamentos dos pacientes. Porém, por termos dado liberdade ao jogador para que possa investigar todos os cantos do consultório de Tratanildo Doencita, é possível perceber que existem bugs relacionados ao processo de colisão entre o médico e os limites do cenário que, no pior dos casos, podem fazer com que nosso querido protagonista atravesse paredes e sofra quedas impressionantes.
Esse tipo de situação pode ocorrer em um game devido a diferentes fatores, tais como as configurações relacionadas a interação física entre objetos e o formato dos colisores dos objetos que estão interagindo entre si.
Existem diferentes abordagens para resolver problemas desse tipo, sendo que nem sempre a mais adequada a um cenário é aplicável a todos os casos. Em nosso projeto, atuaremos em três frentes:
Correção do formato e das dimensões de Colliders dos objetos;
Restrições de movimentação do personagem principal no eixo Y; e
Modificações em parâmetros do Unity, relacionados à detecção de colisões.
Essas alterações visam tanto impedir que o médico acabe por atravessar as paredes e os objetos acidentalmente, quanto evitar que ele sofra uma “queda livre”, caso uma situação como esta venha a ocorrer inesperadamente.
Vamos iniciar as intervenções necessárias, abrindo 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.
Inicialmente, vamos realizar correções envolvendo aspectos de elementos estáticos do cenário, como paredes, janelas e biombos. Na aba Hierarchy, selecione o seguinte conjunto de objetos do cenário fixo, subordinados ao GameObject Ambientacao:
Em seguida, na aba Inspector, localize o componente de tipo Box Collider atrelado aos objetos. Modifique o valor do parâmetro Size Z para 0.02, conforme ilustrado a seguir. Caso queira enxergar os limites dos colisores sendo alterados, clique sobre o botão da opção Edit Collider.
Essa modificação visa dar uma “engordada” na grossura dos Colliders, diminuindo a possibilidade de que elementos externos venham a transpassar seus limites visuais.
Em seguida, selecione o seguinte conjunto de objetos do cenário fixo, também subordinados ao GameObject Ambientacao:
Para esses objetos, será necessário modificar tanto o valor do parâmetro Size Z de seu componente Box Collider (novo valor = 0.02) quanto o do parâmetro Size X (novo valor = 0.05).
A seguir, selecione os objetos Biombo_1 e Biombo_2, subordinados ao GameObject Ambientacao. Realize as seguintes modificações aos valores dos parâmetros de seu componente Box Collider:
O conjunto dos objetos que receberam ajustes nos parâmetros de seus componentes de tipo Box Collider são aqueles com maior potencial de serem impactados por colisões com o personagem principal do jogo.
O chão, embora também seja um objeto de contato constante com o médico, não sofrerá intervenções, pois realizaremos ajustes ao GameObject de Tratanildo que impedirão em definitivo seu deslocamento no eixo Y, aproveitando o fato de termos desenhado um consultório sem escadas ou desníveis. É uma abordagem válida para nossa situação, mas que pode não ser aplicável em jogos em que o personagem principal pule, suba escadas ou rampas.
Após reforçarmos os colisores dos objetos cenográficos, vamos ajustar parâmetros relacionados ao dono do consultório. Na aba Hierarchy, selecione o objeto DoutorCenario, subordinado a Doutores, dentro do grupo de GameObjects Personagens.
Para que possamos enxergá-lo adequadamente durante as intervenções, na aba Inspector, clique sobre a caixa de seleção em destaque a seguir para deixá-lo ativo no cenário.
A primeira intervenção será para viabilizar a já citada “trava” no posicionamento em eixo vertical do GameObject. Na aba Inspector, localize o componente de tipo Rigidbody e, em seguida, no grupo de atributos Constraints, deixe selecionada a opção Freeze Position Y. Além disso, modifique o valor do parâmetro Collision Detection para Continuous, conforme ilustra a imagem a seguir.
A modificação do valor do parâmetro Collision Detection serve para indicar ao Unity que trata-se de um objeto dinâmico no cenário, que precisa de um acompanhamento mais detalhado da engine de física em relação às colisões que venha a realizar ou sofrer.
O valor originalmente concedido (Discrete) é mais adequado a objetos estáticos, como paredes e outros elementos do cenário, pois demanda menos processamento do jogo durante as rotinas de cálculos físicos.
Ainda com DoutorCenario em evidência, vamos modificar o tipo de colisor atrelado ao objeto no momento. Como implementamos métodos de controle do personagem pelo cenário que permitem ao jogador movimentá-lo e rotacioná-lo livremente, em algumas situações específicas as arestas de seu Box Collider podem vir a colidir com os demais elementos do cenário. Para evitar esse problema, vamos utilizar um colisor em formato cilíndrico, cobrindo o perímetro de giro do personagem.
Na aba Inspector, localize o componente de tipo Box Collider, clique com o botão direito sobre seu título e selecione a opção Remove Component.
Em seguida, por meio do botão Add Component, adicione um componente de tipo Capsule Collider. Conceda os seguintes valores a seu conjunto de atributos:
Por fim, desative o GameObject novamente, por meio da caixa de seleção ao lado do nome do objeto, na aba Inspector.
Experimente a execução do jogo, indo à aba Game e clicando sobre o ícone do botão Play:
Dependendo das regiões do cenário em que você realizou o teste de colisão entre o personagem principal e os elementos estáticos do cenário, já é possível perceber uma melhora significativa no bloqueio, baseado nas intervenções que realizamos até o momento. Mesmo assim, persistem alguns “pontos cegos” no consultório, em que, dependendo do ângulo de câmera adotado e da persistência do jogador em tentar “furar os bloqueios”, ainda é possível transpassar os objetos, como podemos notar pela imagem ilustrativa a seguir.
O que ocorre é que, sob determinadas circunstâncias, a velocidade com que o objeto do médico tenta transpassar o objeto bloqueante aparenta ser superior a da força adotada em sentido contrário, fazendo com que, com certa insistência, seja possível vencer os bloqueios que configuramos anteriormente, e, no pior dos casos, impedir que o jogador conclua a aventura, caso saia do perímetro delimitado para o consultório.
Como uma cartada final contra os insistentes caçadores de bugs que, com certeza, tentarão realizar esta e outras peripécias contra a “ordem natural” das atividades em nosso game, vamos ajustar o parâmetro do projeto que controla justamente a velocidade da força aplicada contra o objeto do médico, durante as colisões com outros elementos do cenário.
Interrompa a simulação, clicando novamente sobre o ícone do botão Play e retornando à aba Scene. Em seguida, clique sobre o menu Edit e selecione a opção Project Settings. Na coluna à esquerda, selecione a opção Physics e, em seguida, altere o valor do parâmetro Default Max Depenetration Velocity para 100.
Esse parâmetro determina um valor máximo para a velocidade de retorno aplicada automaticamente a objetos que venham a tentar penetrar Colliders de outros objetos. Ajustando esse valor para cima, equilibraremos a balança de forças entre um doutor que insiste em querer romper as barreiras de seu consultório e os elementos físicos do cenário.
Realize novos testes e experimente novamente tentar avançar sobre os elementos cenográficos de nosso consultório, utilizando diferentes métodos de controle em cada tentativa.


