Made in Bugs Logo
Voltar ao blog

Polaroid Awards

A engenharia por trás de um photo contest indie 📸

Andress MartinAndress Martin
23 de maio de 20265 min de leitura
engenhariaeventosasumi

15 minutos 🕑

Descobrimos que essa é a média de tempo que o jogador joga nosso jogo durante um festival. Então, como transformar 15 minutos de gameplay em algo duradouro?

Eu estava me perguntando isso alguns dias antes do Fórum Eaí Jogos, que aconteceu no final de abril. Asumi: Little Ones é um jogo de fotografia, então pra mim estava óbvio: As fotos são duradouras.

Os jogadores sempre querem mostrar suas melhores fotos, certo? Só que, quando estamos num evento presencial, como permitir que o jogador compartilhe suas fotos com seus amigos? Não dá pra pedir pra cada um trazer um pendrive!

A resposta veio em um formato inédito e complexo, uma competição fotográfica integrada ao jogo.

Screenshot da câmera do jogo enquanto fotografa um animal

O fluxo

  1. Jogador joga a demo no booth do festival
  2. Durante a sessão, ele tira fotos com a câmera do jogo
  3. As fotos vão automaticamente para um site dedicado e para o Discord da comunidade
  4. Outras pessoas votam nas melhores fotos
  5. Anunciamos os vencedores semanas depois, criando engajamento prolongado

Requisitos ✅

Sabíamos que algumas coisas eram necessárias:

  • Zero fricção para o jogador: fotos sobem sozinhas, sem precisar de login
  • Anonimato: cada jogador recebe um código de 5 letras (BAKOM, TIRUP) em vez de nome real
  • Resiliência offline: o sistema precisa funcionar mesmo se a internet do evento for instável ou inexistente (Isso foi mega importante!)
  • Votação pública: pessoas que não foram no evento conseguem votar nas fotos pelo site

⚙ A arquitetura ⚙

Para a mágica, precisamos de: Unity Engine (nosso jogo está lá rs), Supabase (banco de dados), Next.js + Vercel, um Discord bot, Brevo para emails personalizados, e, é claro, jogadores para tirar fotos.

Diagrama de arquitetura

Banco de dados

Criamos um banco de dados online com três tabelas.

  • contest_sessions — uma linha por jogador, indexada pelo código de 5 letras
  • contest_pictures — uma linha por foto, com os metadados da foto (espécies de animais visíveis, hora do dia, modo de câmera)
  • contest_votes — votos anônimos vinculados a um fingerprint

Fila offline

O componente mais crítico do lado Unity é o ContestUploader, uma fila persistente em disco inspirada em message brokers. Quando o jogador tira uma foto, ela é salva localmente e enfileirada em um arquivo JSON. Um loop assíncrono tenta enviar em 4 estágios sequenciais (upload do PNG, insert no banco, post no Discord, done). Cada estágio é idempotente — se o jogo cair entre o estágio 1 e o 2, ao reabrir ele retoma exatamente de onde parou.

Confuso? 😫 Resumo: Se a internet falhar, o sistema tenta de novo. Após 5 falhas consecutivas, o item vai para uma dead letter queue , que é um nome técnico para uma queue de itens que falharam. Isso significa que a máquina pode ficar offline por horas — ou dias inteiros — sem perder uma única foto. Ao reconectar, tudo sobe automaticamente.

Na prática, isso nos permitiu operar em eventos completamente sem internet (estou olhando pra você, Gamescom Latam 🙄).


O site 🌐

As fotos passam por duas páginas:

Página do jogador

O jogador insere seu código de 5 letras e vê todas as fotos da sessão em formato polaroid. Pode escolher uma foto favorita para entrar oficialmente na competição.




Votação pública

Mostra todas as melhores fotos num grid. Qualquer pessoa pode votar sem login — identificação via fingerprint anônimo 🤓.

Website


Discord e emails 📩

No Discord, um bot simples conta todos os votos com ⭐ nas fotos dos jogadores. Serve como canal de votação paralelo ao site.

Para comunicação com os jogadores, usamos Brevo para enviar emails personalizados com o link direto para a página de cada pessoa. Quando o stand opera offline, o cruzamento entre email e código é feito por correlação temporal — o timestamp do Forms bate com o created_at da sessão em 1-2 minutos no fluxo natural.


Nem Tudo São Flores + o que aprendemos 🌹

Eventos são ambientes hostis para software dependente de rede. Internet cai, hotspot morre, firewall bloqueia. Mesmo funcionando offline, um dos stands da Gamescom infelizmente não conseguiu participar da competição 😢

Ainda assim, ficamos muito contentes com todos que conseguiram participar 💖

Foram 165 fotos tiradas, de mais de 15 jogadores participantes. Nunca esperávamos esse nível de participação de um jogo tão novo no mercado.


Tem muito, muito mais coisa que eu poderia falar aqui, como a ferramenta anti-spam e anti-bot, o sistema de randomização do grid de votação e o gerador de senhas únicas, mas o coração do sistema é esse.

O Polaroid Awards continua vivo na nossa comunidade (e nas polaroids que enviamos pelo correio).

📢 Quer participar? Ainda dá tempo de votar até 31 de maio! Vote aqui

Se você está pensando em fazer algo mirabolante parecido para o seu jogo, espero que esse post sirva como mapa e como aviso sobre as pedras no caminho.

Compartilhar:LinkedInTwitter

© 2025 Made in Bugs. All rights reserved.