Publicidade no topo da notícia
Atualizacoes

Aprendendo a programar jogos em Unity: correções para as colisões entre personagens e elementos do cenário

Modificaremos parâmetros no projeto para solucionarmos problemas relacionados à colisões entre objetos do cenário.

Aprendendo a programar jogos em Unity: correções para as colisões entre personagens e elementos do cenário
Publicidade no meio da matéria

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.

Esta notícia é um resumo. Os créditos e o conteúdo completo são da fonte original.

Fonte: GameBlast

Ler matéria completa em GameBlast →

Publicidade ao final da matéria

Notícias relacionadas