Postmortem de projeto: Ultimate Tank Experience

FoG ICMC-USP
Blog do FoG — Fellowship of the Game
6 min readSep 12, 2019

Autor: Rafael “Lag” Clerici

Semestre: 2019.1

Equipe:

  • Arthur “Amnésia” Rosa de Souza: Programador principal, Artista suporte
  • Rafael “Lag” Pedrosa Silva Clerici: Líder, Game Designer, Artista principal
  • Vinícius “Vini” Ricardo Carvalho: Sonoplasta
  • Thiago “Float” de Souza Pauli: Programador suporte
  • Ana Moreno: Artista suporte
  • Leonardo Chieppe: Product Owner

Disponível em: http://fog-icmc.itch.io/ute

Agradecimentos adicionais:

Boxophobic por disponibilizar uma skybox bem legal, JMO Productions pelos shaders, e à Unity por ter adquirido os assets Probuilder e Progrids. Além disso, agradecimentos especiais ao British Pathé pelo enorme acervo disponível para consulta.

Sobre o jogo

Nosso jogo começou com uma ideia bastante simples: existem vários jogos de tiro onde você pode pilotar um tanque, mas dizem que grande parte da dificuldade em controlar essas feras de aço vêm da coordenação e capacidade de trabalhar em equipe de seus tripulantes. Então, decidimos, como um experimento, fazer um jogo que seguisse essa premissa. Na verdade, já existem alguns assim, mas eles são todos simuladores militares ultra-realistas, que te deixam esperando trinta minutos para ver um pontinho verde-musgo se mexer a dois quilômetros de distância e consideram que isso foi ação demais para o dia de hoje. Nós faríamos algo mais casual, mas dinâmico, mas simples. Nós traríamos aos jogadores a Melhor Experiência de Tanques.

Visão do piloto do tanque durante a partida

Nossa principal diretriz se tornou facilidade de uso e acesso. Queríamos uma versão para celular, já que é mais provável que você tenha um celular no bolso ao invés de um computador. As mecânicas tinham que ser simples, para você chamar seu amigo e ele descobrir como joga no meio da partida. E, por fim, precisávamos botar todas as informações relevantes numa telinha de celular.

O que deu certo

Devido ao enorme esforço e experiência por parte da equipe de programação, conseguimos um protótipo bem cedo. Ter um protótipo rapidamente foi ótimo para testar se o modelo de jogo era realmente divertido, descobrir problemas futuros mais cedo e aumentar a motivação da equipe, já que podíamos ficar jogando toda vez que nos reuníamos com a desculpa que estávamos testando.

Além disso, conseguimos um bom sistema de Networking logo cedo no projeto, permitindo vários ajustes no jeito que dispositivos se conectavam. Fizemos bastante pesquisa a respeito, já que a infraestrutura atual da Unity é um tanto… Defasada para isso. Decidimos então usar uma API chamada Mirror, que, depois de alguns perrengues, funcionou muito bem. Precisamos aprender um bocado de como as redes funcionam, e pensar muito bem em quais tipos de dados são mandados para cada dispositivo, tentando minimizar latências. Mas ainda tivemos que utilizar um pequeno truque. Não importa o quão boa sua rede seja, ainda haverá um certo delay entre jogadores. Aí que entra um pouquinho de adivinhação. Na verdade, deixamos o jogo de todas as pessoas rodando um pouco no passado, e todas elas fazem uma previsão de como as coisas devem continuar a rodar. Dessa maneira, você não *precisa* receber a posição dos tanques a cada milissegundo, já que, 99% das vezes, sua previsão vai estar certa, e o tanque de verdade vai estar bem aonde você estava mirando.

Visão do atirador do tanque, prestes a disparar contra um oponente

Outra coisa que ajudou bastante, principalmente no final do projeto, foram as ferramentas Probuilder e Progrids, disponíveis gratuitamente na Unity. Além de permitirem prototipagem rápida, elas também aceleraram bastante o processo de criação de níveis, em conjunto com algumas técnicas utilizadas pela frente de arte.

Nós acabamos aprendendo e inventando um bocado de técnicas para criar um estilo de arte elegante, simples de ser feito e leve nos celulares alheios (ou ao menos foi isso que achamos). Primeiramente, usamos Atlas de Texturas em quase tudo. Ou seja, fizemos o modelo, criamos uma paleta de cores e deixamos cada face do modelo com apenas uma única cor, sem nos importarmos nem um pouco em fazer um mapa UV e colori-lo como pessoas decentes. Colocamos toda essa paleta numa única imagem, tornando-a um único material na Unity, poupando carregamento e configurações. Por fim, construímos casas e partes do cenário no Probuilder e Progrids, depois encaixando janelas e portas, nos livrando do sofrimento de modelar casas uma a uma e espalhar pelo mapa.

Mas isso tudo foi conquistado apenas com sangue, suor e lágrimas metafóricas. O projeto foi cheio de surtos produtivos, quando assets e funcionalidades ficavam prontas a partir do zero de um dia para o outro, porque o integrante da equipe ficou trabalhando nisso do começo de um dia ao começo do outro. Não fizemos isso por falta de planejamento, e sim por causa de pressões externas: a graduação não tava fácil para ninguém, mas seguimos adiante.

O que deu errado

Bem, pra começo de conversa, nosso escopo era grande. Nossa proposta era um jogo multiplayer, networked e multiplataforma. Era um tanto óbvio que cortaríamos algumas coisas, e isso foi preciso. Pelo menos já tínhamos uma noção do que cortar, para não sofrer no desenvolvimento. Porém, sofremos na alma, já que queríamos implementar mais tanques, mais mapas, mais modos e outras sandices. Bem, ainda dá pra se divertir com dois tanques só no mata-mata.

Por outro lado, algo totalmente inesperado foi o fato de que todas as medidas e verificações adicionadas para garantir sucesso no projeto aumentaram a pressão nos integrantes do mesmo, sem aumentar a produtividade. O plano original de reuniões semanais com todos os membros presentes foi por água abaixo rapidamente, já que uma planilha provou que não havia sequer um espaço de quinze minutos onde todos estavam dispostos a se reunir, mesmo que pelo aplicativo Discord. Mesmo assim, a garantia das reuniões nos deixou um tanto relapsos quanto ao uso do aplicativo Trello. Nos comunicamos bastante de maneira informal, e o Project Owner ficou bastante deslocado da realidade do projeto. Ele também não participou das reuniões.

Todas essas deficiências de planejamento acarretaram em alguns problemas. Como já diria von Moltke, nenhum plano sobrevive ao primeiro contato com o inimigo. Alguns planos redigidos no começo do projeto foram bastante úteis para nos guiar mais tarde (por isso não leia o que estou dizendo como “não faça planos”. O próprio von Moltke se revira em seu túmulo quando pessoas interpretam sua frase desse jeito). Porém, alguns outros acabaram nos levando a becos sem saída e consumindo tempo. Acho que uma análise mais sucinta da situação seria melhor do que o caminho que tomamos, mas mesmo olhando em retrospecto, este é um assunto bastante difícil de estimar e especular sobre.

Houveram alguns problemas de distribuição de tarefas. O programador e o artista principal acabaram fazendo grande parte dos recursos visuais e de código do jogo, com alguns membros dando uns sumiços assustadores. Parte se deve à inexperiência, parte a mau planejamento de tempo por parte dos membros.

Conclusões

Bem, ouso dizer que o Ultimate Tank Experience se tornou a Ultimate Gamedev Experience. Mesmo com os vários contratempos, deserções e embaraços documentativos, eu adorei fazer este jogo, e estou feliz com o resultado final. Acho que digo isso por todos nós que desenvolvemos.

Não só conseguimos um jogo legal no final, como aprendemos muita coisa pelo caminho. O Vinícius mexeu com sonoplastia pela primeira vez, o Arthur conseguiu fazer um jogo com networking e um grande escopo, Thiago programou pela primeira vez com jogos networked, e eu fiz (muita) arte 3D.

Por fim, eu realmente acho que o UTE é um jogo no qual daria para se trabalhar ainda mais e crescê-lo. Ele foi construído pensando nisso, afinal de contas. Porém, precisamos lançar alguma coisa em algum momento. Esperamos que, ao menos, nossa dedicação e obsessão em polir cada vez mais nosso jogo dêem resultado.

--

--

FoG ICMC-USP
Blog do FoG — Fellowship of the Game

Grupo de extensão da USP-São Carlos voltado para o desenvolvimento de jogos