Física Interativa em Unity 5
- Wagner Ferreira
- 11 de mar. de 2016
- 3 min de leitura
Atualizado: 30 de out. de 2019
Assim como o projeto de Flash, também recebi um trabalho para fazer um jogo da matéria de Física. Nesse caso o pedido foi mais específico: transformar uma lista de áreas e tópicos de física em algo interativo.

O Jogo
Clique no botão ao lado para jogar diretamente no navegador. Recomendo utilizar o Firefox ou o Chrome, mas nesse caso a aceleração de hardware precisa estar ligada ou o jogo ficará muito lento, podendo até travar o WebGL.
O jogo foi feito em Unity 5.3.X e exportado para rodar com WebGL sem nenhuma instalação.
A Ideia
De início não tinha a mínima ideia de como fazer. Felizmente um colega da faculdade que também fez parte do grupo de desenvolvimento me lembrou de um currículo interativo criado em flash onde a pessoa deve chegar com o personagem a cada ponto do currículo para ter acesso a informação.
Graças a isso adaptamos a ideia para os tópicos de física, criando um jogo 2D com a visão de cima onde o jogador controla uma bola e deve encontrar cada tópico para ver o conteúdo.
O Desenvolvimento
Dois casos que me deram um trabalho surpresa foram: a transparência de materiais e o uso de texto coberto.
No caso da transparência descobri que nem todo tipo de material aceita transparência. Felizmente a solução foi simples, só precisei trocar o modo de renderização para "fade".
No caso do texto encoberto já foi mais estranho, precisei criar um novo shader e textura de texto. Se estiver curioso sobre como, veja esse Tutorial (em inglês) que segui para fazer funcionar.
Foi adicionada persistência de dados para facilitar várias atividades do jogador. Primeiro foram persistidos os tópicos debloqueados, deixando o nome visível, assim o jogador não precisa se preocupar em lembrar onde ele já esteve. Em seguida foi persistida a posição do personagem para o tópico que ele esteve a última vez, evitando ter que seguir todo o caminho de novo ao voltar a tela principal.
Toda a interface de texto dos tópicos abordados foi feita em uma única cena, deixando mais leve e fácil de editar. Um bug que surgiu no desenvolvimento foi com o sistema de scroll onde o conteúdo movia para fora da tela toda vez que o jogo era executado, para resolver isso desativei o objeto que formava o bloco de cada tópico, só ativando programaticamente durante a execução.
Mini-projeto: Reflexão
Um pouco antes desse projeto fiz um menor onde era possível controlar um laser e passar por vários espelhos, dando a sensação de reflexão. Criei esse projeto com um colega da turma que teve a ideia, mas não tinha o conhecimento para executar a programação. No final aproveitei para adicioná-lo ao projeto principal como um bônus secreto.
Embora tenha sido menor, ele deu tanto trabalho quanto o projeto de física completo. A reflexão em si foi fácil de calcular, o próprio Unity já traz algumas facilidades para isso. As minhas duas grandes dores de cabeça foram como RayCast e o Line Renderer.
No caso do Raycast foi um problema difícil no início, mas extremamente simples depois que entendi a causa raiz.
Quando eu tentava lançar um novo Raycast depois de colidir com o espelho ele simplesmente colidia antes mesmo de sair do lugar. A solução foi mover o início do Raycast uma unidade mínima para a frente da direção que eu queria.
O Line Renderer já trouxe um problema que, pelas minhas pesquisas, é bem conhecido pela comunidade, mas ao mesmo tempo não tem uma solução exata, só uma gambiarra para mascará-lo.
Quando se usa o Line Renderer para criar mais de uma linha, as linhas se distorcem. Isso acontece porque a lógica desse objeto tenta fazer com que a linha 2D fique "reta" no espaço 3D. Para resolver isso a única alternativa é criar uma linha intermediária de tamanho mínimo que irá fazer a distorção de forma imperceptível mantendo as linhas principais retas.
Agradecimentos Especiais
João Pedro Nunes - Pela ideia inicial e pela contribuição em pesquisar o conteúdo para os tópicos.
Gregório Tkotz - Pela ideia do projeto de reflexão óptica.