Adicionando buracos de bala em um FPS

Continuando na minha demo de FPS, implementei dessa vez marcas de bala nas paredes e portas.

A marca de bala é feita com um objeto texturizado e pra posicionar no cenário eu uso o resultado do raycast do Unity, que retorna o objeto interceptado, o ponto de interseção e a normal naquele ponto. Com esses dados, eu posiciono a marca de forma que ela fique na frente do objeto acertado.

Como uma forma de otimização, as marcas de bala são guardadas em uma lista que pode ter seu tamanho máximo configurado para qualquer valor. Quando o tamanho máximo for atingido, os objetos mais antigos são destruídos liberando memória. Dessa forma, é possível gerar marcas de bala no cenário sem se preocupar em ter estouro de memória e problemas de desempenho.

No vídeo abaixo tem uma demonstração dessa nova função, com os buracos de bala sendo gerados nas superfícies atingidas por tiros e sendo removidos quando o tamanho máximo da lista é atingido. Pra deixar a demonstração mais fácil, eu limitei a cinco itens o máximo da lista, mas esse valor pode ser bem maior.

 

Estou disponibilizando também a demo atualizada aqui: FPS Demo.

Vídeo da demo de FPS no Unity

Conforme eu comentei antes, estou fazendo uma demo de um FPS no estilo dos primeiros jogos do gênero. A ideia é usar essa demo pra estudar algumas coisas sobre desenvolvimento de jogos e Unity, ter mais um item pra adicionar no portfólio e, quem sabe, transformá-lo em algo que as pessoas realmente queiram jogar.

Mas vamos fazer uma coisa por vez. Por hora, deixo vocês com um vídeo da fase demo que montei até agora. Nessa fase, há um contador de tempo disparado ao pisar sobre a faixa de largada e inimigos aparecem no cenário bloqueando as portas até chegar na faixa de chegada, onde o tempo para de correr. Quem se interessar, pode jogar aqui: FPS Demo.

Criando um FPS old school no Unity

Um dia desses ouvindo o 99 Vidas sobre Doom, Quake e Duke Nuken bateu aquela vontade de implementar um jogo nesse estilo, só pela diversão! Ontem resolvi pegar o Unity e ver o que dava pra fazer. Nesse post vou mostrar um pouco do que implementei de ontem pra hoje.

A ideia inicial é implementar um FPS usando as mecânicas desses jogos antigos. Sendo assim, a principal diferença em relação à maioria dos FPS do mundo é a ausência de mira no mouse. Aqui só é possível mirar no eixo horizontal. Eu fiz isso por dois motivos: pra manter um estilo parecido com o Doom original e porque pretendo, no futuro, aproveitar essa base em um jogo de iPhone (pelo que eu andei vendo, jogos em primeira pessoa funcionam mais ou menos bem no iPhone usando esse estilo de controle – vide Wolfenstein 3D).

A programação foi toda feita por mim, não usei nenhum script pronto. Pra arte, eu usei algumas texturas do Doom (retiradas principalmente deste site), a arma é do Duke Nuken 3D e os sons eu arrumei por aí – isso não é importante.

Bem, e o quê tem no jogo? Resumidamente, eis a lista das funções implementadas:

  • Controle do personagem em primeira pessoa: o personagem anda para frente e para trás, esquerda e direita, e pode girar ao redor do eixo Y para ambos os lados também;
  • Função de tiro: uso o raycast do Unity pra testar se os tiros acertaram os NPCs da cena (usando uma layer específica pra isso, garantindo que o raio não vai ser testado contra todos os objetos da cena);
  • Animação de tiro: eu fiz a animação de tiro usando aquele meu componente de sprite 2D. A arma não é um objeto 3D, mas sim uma imagem chapada na tela que é animada quadro a quadro quando um tiro é disparado;
  • Morte dos NPCs: quando um tiro acerta um NPC, este recebe um dano e desaparece da cena quando sua energia e zerada;
  • Apresentação dos NPCs: nessa versão, os NPCs aparecem como aquelas placas de estandes de tiro. Quando o jogador entra em um trigger, os NPCs associados ao trigger são ativados;
  • Diferentes tipos de porta: as portas no jogo impedem o progresso do jogador. Eu programei três tipos de porta. A normal é aberta quando o jogador se aproxima e entra no seu trigger. A porta com chave funciona da mesma forma, mas exige que o jogador tenha a chave da mesma cor no seu inventario. Por fim, tem umas portas que se abrem somente quando todos os NPCs da área foram mortos;
  • Chaves e inventario: por hora, o inventário serve só pra guardar as chaves que o jogador coletou. O inventario é consultado nas portas que exigem uma chave pra abrir. A chave tem um script fica rotacionando o objeto, pra dar um efeito visual melhor;
  • Cronômetro: na demo que eu montei, o objetivo é alcançar o final da fase no menor tempo possível. A contagem de tempo se inicia quando o jogador entra no trigger de início do cronômetro e termina quando ele toca o trigger de final.

Devido ao tempo de desenvolvimento bem curto (foram 24 horas corridas, mas nesse meio tempo eu parei pra fazer várias outras coisas, dormi, vim de Niterói pra Teresópolis…) e à falta de planejamento (fui implementando as funções conforme ia pensando em coisas interessantes pra fazer, ao invés de planejar tudo antes), até que o resultado ficou legal. A ideia agora é fazer uma fase mais elaborada e adicionar NPCs com inteligência artificial. Tem ainda muitas funções pra implementar, como uso de múltiplas armas, munição limitada e controle de energia do jogador. Mais pra frente também pretendo fazer uns testes com multiplayer.

Quem se interessar, pode testar o jogo diretamente no navegador através desse link: FPS Demo. Os controles são:

  • W, S: para para frente/para trás;
  • A, D: vira para esquerda/direita;
  • Q, E: anda para esquerda/direita;
  • Espaço: atira;
  • Shift esquerdo (segurando): corre.