Up to four synced Unity editors stream side by side. Your agent changes every player at once, and you never build a player.
Library, so nothing re-imports.Each extra player is a real hidden Unity editor that shares your Assets, Packages and Library, so a clone boots in seconds. Each has its own stream, console and input, and the primary's hot-reload and scene changes reach all of them. One Play button starts the grid.
Through satura_exec on the Unity MCP server, an agent adds players and enters Play Mode on all of them. Your handles then run on one player or every player on the same frame:
[SaturaHandle("Jumps, and returns the height reached")]
public static float Jump() { ... }
// satura_exec
await unity.addPlayer()
await unity.play('Assets/Scenes/Arena.unity')
return await handles.call('Jump', { player: 'all' })
→ [{ player: 1, status: 'done', value: 2.1 }, { player: 2, status: 'done', value: 2.1 }]
Each player reports its own result, and SaturaHandles.PlayerIndex tells a handle which player it is. The agent reads the results, fixes what broke and runs it again. The report shows you the recorded match.
Up to four per session: the primary plus three clones. Headless NoGraphics mode is single-player.
In one satura_exec script it adds players with unity.addPlayer(), plays the scene on all of them, then calls your handles on one player or on all. { player: 'all' } starts a handle on every player on the same frame.
For logic and netcode bugs, mostly. Clones are editors, so test an IL2CPP build on target hardware before you ship.
Reproduce the netcode bug, fix it and re-run the match without leaving the app.