I spent eight years in the games industry, from 2017 to 2025. Not writing gameplay — I was on the other side of the wall: infrastructure, build pipelines, CI, and the technical decisions a team then lives with for years. In every studio I worked at, the engine was Unity. In none of them was that a decision anyone in the room had made.
Passei oito anos na indústria de games, de 2017 a 2025. Não escrevendo gameplay — eu estava do outro lado do muro: infraestrutura, pipeline de build, CI, e as decisões técnicas com as quais um time depois convive por anos. Em todos os estúdios onde trabalhei, a engine era Unity. Em nenhum deles isso tinha sido uma decisão tomada por alguém na sala.
That distinction matters more than it sounds. A choice can be revisited. An inherited condition just gets paid for, month after month, by whoever sits closest to the machine. That was usually me.
Essa distinção importa mais do que parece. Uma escolha pode ser revista. Uma condição herdada só é paga, mês após mês, por quem está sentado mais perto da máquina. Normalmente eu.
So this is not a review of Unity. I am the wrong person to ask about its editor or its asset workflow — I barely touched them. It is a list of the four ways an engine arrived on my side of the wall, and why every tool I have picked since is picked against them.
Então isto não é uma review do Unity. Sou a pessoa errada pra perguntar sobre o editor dele ou o fluxo de assets — eu mal encostava neles. É uma lista das quatro maneiras pelas quais uma engine chegava do meu lado do muro, e por que toda ferramenta que escolhi desde então é escolhida contra elas.
The version nobody upgrades
A versão que ninguém atualiza
Every project I touched was pinned to an engine version chosen years earlier, and every project had the same reason: the upgrade broke things. Not catastrophically — just enough that someone would have to spend a sprint on it, and the sprint was never available. So the pin stayed. Then a plugin needed a newer engine. Then a platform SDK needed a newer plugin. Then a store deadline needed the platform SDK.
Todo projeto que eu peguei estava travado numa versão de engine escolhida anos antes, e todo projeto tinha o mesmo motivo: o upgrade quebrava coisas. Não catastroficamente — só o suficiente pra alguém ter que gastar uma sprint nisso, e a sprint nunca estava disponível. Então a trava ficava. Aí um plugin precisava de uma engine mais nova. Aí um SDK de plataforma precisava de um plugin mais novo. Aí um prazo de loja precisava do SDK de plataforma.
It is the oldest shape in operations: deferring maintenance saves money until the day it doesn't. The version pin is the cleanest example of it I know. The debt is invisible for three years, and then it is the only thing on the board.
É o formato mais velho da operação: adiar manutenção economiza dinheiro até o dia em que não economiza. A trava de versão é o exemplo mais limpo disso que eu conheço. A dívida fica invisível por três anos, e aí ela é a única coisa no quadro.
If it doesn't run without the editor, it doesn't run in CI
Se não roda sem o editor, não roda em CI
This is the one that cost me the most hours. When the rules of the game live in scenes, prefabs and components, there is no seam to test against. You cannot load the logic, run it, and assert on the result. You can only start the whole engine and look.
Essa é a que mais me custou horas. Quando as regras do jogo moram em cenas, prefabs e componentes, não existe costura pra testar. Você não consegue carregar a lógica, rodar e verificar o resultado. Você só consegue subir a engine inteira e olhar.
A pipeline built on top of that is not a pipeline, it is a ritual: a machine that needs a licence and a GPU, an editor process that takes minutes to reach the point where it could tell you anything, and a failure mode where the build is red because a runner filled its disk, not because the code is wrong. Feedback that slow stops changing behaviour. People stop reading it.
Um pipeline construído em cima disso não é um pipeline, é um ritual: uma máquina que precisa de licença e de GPU, um processo de editor que leva minutos pra chegar no ponto em que poderia te dizer alguma coisa, e um modo de falha em que o build fica vermelho porque um runner encheu o disco, não porque o código está errado. Feedback tão lento deixa de mudar comportamento. As pessoas param de ler.
A test that needs a GPU is not a test. It is a rehearsal.
Um teste que precisa de GPU não é um teste. É um ensaio.
That contrast is why everything I write now starts at the same boundary: the rules go in a plain Rust library that depends on no renderer and runs headless, so a batch of runs can go straight into a CSV with no GPU and no window anywhere in the process. I did not reach that boundary from theory. I reached it from eight years of wanting it and not having it.
Esse contraste é a razão de tudo que eu escrevo hoje começar na mesma fronteira: as regras vão numa biblioteca Rust comum, que não depende de renderizador nenhum e roda headless, então uma leva de execuções vai direto pra um CSV, sem GPU e sem janela em lugar nenhum do processo. Eu não cheguei nessa fronteira pela teoria. Cheguei nela por oito anos de querer e não ter.
The iteration loop belongs to the tool, not to you
O loop de iteração é da ferramenta, não seu
Compile, wait, enter play mode, wait, navigate back to the state you were testing, look, change one number, repeat. Each wait is small enough to defend in a meeting and large enough to decide how people work. Teams adapt to it: bigger changes, batched less often, checked later — because when the cost of checking is high, checking becomes something you schedule instead of something you do.
Compilar, esperar, entrar em play mode, esperar, navegar de volta até o estado que você estava testando, olhar, mudar um número, repetir. Cada espera é pequena o suficiente pra ser defendida numa reunião e grande o suficiente pra decidir como as pessoas trabalham. Os times se adaptam: mudanças maiores, agrupadas com menos frequência, conferidas mais tarde — porque quando o custo de conferir é alto, conferir vira algo que você agenda em vez de algo que você faz.
That is a design decision about your team, and the tool made it. Across eight years I watched it grow the same habits in studios that had nothing else in common.
Isso é uma decisão de design sobre o seu time, e quem tomou foi a ferramenta. Ao longo de oito anos eu vi isso criar os mesmos hábitos em estúdios que não tinham mais nada em comum.
The variable that isn't yours
A variável que não é sua
The last one is not technical, and it is the one that changed how I choose tools. The terms under which the engine could be used were always somebody else's to change — licensing, price, what counts as a seat, what the runtime is allowed to do. When those terms moved, the studio held a meeting that was not about the game, and the outcome of that meeting was not ours to write.
A última não é técnica, e é a que mudou o jeito como eu escolho ferramentas. Os termos sob os quais a engine podia ser usada sempre estiveram na mão de outra pessoa — licenciamento, preço, o que conta como um assento, o que o runtime pode fazer. Quando esses termos se mexiam, o estúdio fazia uma reunião que não era sobre o jogo, e o resultado dessa reunião não era nosso pra escrever.
I run infrastructure for a living, so I have a name for that: a single point of failure with a sales department. You can engineer around a service that goes down. You cannot engineer around a licence.
Eu opero infraestrutura pra viver, então eu tenho um nome pra isso: um ponto único de falha com departamento comercial. Dá pra contornar um serviço que cai. Não dá pra contornar uma licença.
What I ask of a tool now
O que eu exijo de uma ferramenta hoje
I did not leave looking for a better engine. I left looking for tools that fail in ways I can do something about. There are three I actually use, and the reason is the same in all three:
Eu não saí procurando uma engine melhor. Saí procurando ferramentas que falham de um jeito sobre o qual eu consigo fazer alguma coisa. São três que eu realmente uso, e o motivo é o mesmo nas três:
- Rust, from scratch. No engine underneath at all. The simulation is a library, the renderer is a detail, and there is nothing in the build I cannot read.
- Rust with Bevy. An engine, but one whose source sits on my disk and whose licence cannot be renegotiated at me. When it is in the way, that is a pull request, not a support ticket.
- Godot. The same argument with a different trade: I give up writing the tooling myself and get an editor back, and the exit stays open because the project does not belong to a company that needs me to keep paying.
- Rust, do zero. Nenhuma engine embaixo. A simulação é uma biblioteca, o renderizador é um detalhe, e não existe nada no build que eu não consiga ler.
- Rust com Bevy. Uma engine, mas uma cujo código está no meu disco e cuja licença não pode ser renegociada contra mim. Quando ela atrapalha, isso é um pull request, não um chamado de suporte.
- Godot. O mesmo argumento com uma troca diferente: eu abro mão de escrever a ferramenta e ganho um editor de volta, e a saída continua aberta porque o projeto não pertence a uma empresa que precisa que eu continue pagando.
The list is short and the criteria are shorter: it runs headless, it tests in CI, the source is auditable, and nobody can change the terms underneath me. None of that is about graphics, and none of it is taste. It is the difference between a tool I operate and a tool that operates me.
A lista é curta e os critérios são mais curtos ainda: roda headless, testa em CI, o código é auditável, e ninguém muda os termos debaixo de mim. Nada disso é sobre gráficos, e nada disso é gosto. É a diferença entre uma ferramenta que eu opero e uma ferramenta que me opera.
Eight years is long enough to learn the shape of a constraint. It is also long enough to notice that most of the constraint was never technical. It was about who got to decide, and how far away they were sitting.
Oito anos é tempo suficiente pra aprender o formato de uma restrição. Também é tempo suficiente pra perceber que a maior parte da restrição nunca foi técnica. Era sobre quem podia decidir, e a que distância essa pessoa estava sentada.