Loading...
Loading...

View Source Code
github.com/Danm72/ai-gamedev-kit
Connect on LinkedIn
in/d-malone
Follow on Twitter/X
@danmalone_mawla
Share this article
Crush Depth is a submarine game. You dive from a rig, salvage wrecks, watch your air and your hull, and get back up before something goes wrong.
Every line of it came from Claude Code agents. I write the asks, look at the screenshots and play the builds. I don't write code and I don't open the editor. The Godot version got to about 38,450 lines of GDScript and 124 Python tests.
Here's the 30-second trailer, cut from in-game footage of the Godot build:
Building that way changes what you want from an engine. These are the lessons that held up.
The most useful thing in the repo isn't game code. It's a small TCP bridge. The game listens on a local port and takes one JSON command per line. Get the state, step a few frames, press a button, take a screenshot, quit.
Tests and agents play the game through it, headless, with a fixed seed. In lockstep mode, two runs with the same seed give the same state.
That bridge is what made the engine switch cheap. The Unity build answers the same commands with the same JSON. So the Python tests, the MCP server the agents use to see the game, and the playtest bot run against both engines. About 92 of the 124 tests talk only to the bridge. They run against Unity as they are, once the systems they test are ported.
If you're building a game with agents, build this first.
The models were trained on older engines. Left alone, they write Godot 3 code in a Godot 4 project. In Unity they write rb.velocity, which is now linearVelocity. Some of these compile and do the wrong thing. Some don't compile at all: GetInstanceID() is a compile error in Unity 6.7.
Two things fixed it:
A lookup tool for each engine. godot_api.py and unity_api.py answer from the exact engine source and manual for the version the project pins. If the tool says "no member", the member doesn't exist and the agent doesn't use it.
Hooks on every file edit. They block outdated API and print the lines to fix. The Unity hook also blocks hand edits of scene and prefab files, so agents change scenes through editor scripts.
Each engine also has a doc of what changed since the version the models know, plus the gotchas. The Unity one lists 54. Here's one from Godot. Jolt physics is the default only for projects made in 4.6 or later, so this project still runs Godot's own physics. It's the kind of fact an agent gets wrong unless something stops it.
This was the biggest single jump in agent output quality, and it's cheap to build.
Godot wasn't getting close to the key art, so I asked the agents for a Unity spike. The first round compared licences, build sizes and edit-to-test times. I threw that conclusion out. What mattered was how close each engine got to the key art, and how much agent effort it took to get there.
So round 2 tested the look. An agent exported the real Godot scene: 147 meshes, about 7,300 placements and 289 textures, plus the lights, decals and fog. Unity editor scripts rebuilt it in HDRP from code, with the same assets.
Then fresh agents judged it blind. Each judge saw the key art and two unlabelled frames in a shuffled order. They scored each frame out of 10. Unity won 12 of 12 picks across two views and two sets of frames. Its mean scores ran from 5.5 to 6.2 and Godot's from 3.8 to 4.3.

That result has limits, and the write-up kept them:
So I played the Unity build myself. My note back to the agents was: "unity is the clear winner, lets green light a full port. It looks stunning."
The first Unity rebuild of the scene took 56 minutes. The agent hit 12 blockers on the way, and each one took between 2 and 14 minutes to fix.
A few examples:
None of these are hard, but each one eats an afternoon when you hit it by hand. The agent logged each blocker with its start time, end time and fix, which is how I have the numbers.
The game has to run on a Steam Deck. So before the full port started, the spike scene went on the Deck with a 60-second bench. The target is 30 fps.
| Build | Deck average fps |
|---|---|
| HDRP, native 1280 x 800 | 16.9 |
| URP on the 6.7 beta, native | 23.4 |
| URP on the 6.7 beta, 50% scale + FSR 1 | 29.2 |
Around the same time, Unity marked HDRP as deprecated in Unity 7, with support through the first Unity 7 LTS. That settled it, and the port went to URP. It costs some look: URP has no volumetric fog, so the light shafts are gone and the frame reads flatter. New URP features in 6.7 (GTAO, screen-space reflections, AgX tonemapping, Surface Cache GI) win some of it back. Getting the Deck to 30 fps at native is its own lane in the plan.

I pinned the port to the Unity 6.7 beta for those URP features. That has a price. On day one the agents found:
-nographics breaks URP's GTAO, so any step that touches the renderer needs a GPU.Each one went to the render lane with a workaround in code.
I run several agents at once, each in its own git worktree. Unity doesn't make that easy out of the box. The editor locks its project folder, and each worktree needs its own Library folder of about 5.7 GB.
The fix is to seed each new lane's Library with an APFS clone of a warm one. A new lane is then ready in 74 seconds, against 223 seconds for a cold import.
On my M2 Max with 32 GB, four Unity jobs at once was the ceiling. Each job took 93 seconds and 6.6 GB of RAM stayed free, with no swap. So there's a hard cap of four Unity editors across all agents, and every Unity job goes through one script that waits for a slot.
Checked:
Not checked yet:

The Godot game. It's frozen now. It stays runnable as the reference the Unity port is checked against, then it goes to an archive.
HDRP's water and volumetric light. I traded them for Deck performance and a pipeline with a future.
A stable engine. A beta has its own bugs, and the agents now spend time on them.
Disk and memory. The Unity editor is 9.2 GB, every lane needs its own Library, and a single Unity job peaks around 10 GB of RAM.
When agents do the building, the engine question changes. "Which engine can agents drive, test and fix with no screen? And how close does it get to the look I want?" Cost and install pain barely register next to that.
The reusable parts of this setup are on GitHub at github.com/Danm72/ai-gamedev-kit. It's MIT licensed. In it:
godot_api.py and unity_api.py answer from the exact engine source, so the agent stops guessing.Explore the Full Code
Star the repo to stay updated
Let's Connect
Follow for more smart home content
Follow on Twitter/X
@danmalone_mawla
Continue reading similar content

A free, open-source screenshot app for the Mac. I take screenshots all day, and that meant CleanShot X. This week I replaced it with FreeShot, which I built in one session with Claude Code. Here's what it took, what it cost and what I gave up.

Most SaaS treats a new user like a transaction — a sign-up confirmation, then silence. Lifecycle messaging is how you make the product feel alive instead. Here's how I built a full system in Intercom — 37 outbound messages wired into four Series — by pointing Claude at Intercom's own internal API, plus the one rule most teams get wrong.

I built 9 Claude Code skills to keep my one-person portfolio business oriented around goals, KPIs, and the actions that actually move them. Here's how the whole system works.