Unreal Engine 5.8 · Plugin
ButterNet Multiplayer Voxel
- 32 players digging
- 12.53ms game-thread cost at the 99th percentile on a desktop CPU, all of them digging at once
- Per edit on the wire
- ~60bytes for a replicated edit op — payload plus replication overhead, not a full chunk resync
- Dig at radius 3
- ~0.05ms on a desktop CPU, including debris detection into attached ground
- Persistence footprint
- ~530bytes for an eight-chunk edited volume saved to disk
What it is
ButterNet Multiplayer Voxel adds editable, replicated, persistent smooth-voxel volumes to Unreal Engine. Players dig, fill, paint and smooth the world; every machine sees the same result; edits survive restarts; and pieces that lose their footing break off and fall.
It is a plugin with no dependency on any game code, driven from Blueprint or C++ through a small set of functions, events and interfaces.
In motion
What you can build
Diggable ground
Carve tunnels and caves through ordinary landscape terrain. Collision is lowered under dug columns; hide the landscape surface per-column with a material mask, or hide whole components with no material changes.
Destructible structures
Voxelise any closed static mesh and let players break it apart; disconnected pieces spawn as physics rubble with replicated movement.
Persistent player changes
Store whole-volume state locally or through any backend you write a persistence provider for.
Volumes and generation
Volumes are actors with a definition asset; chunks of 32 × 32 × 32 voxels at any voxel size you choose. A volume is either a Blob — a free-standing shape built by a generator — or Terrain, which takes its ground from a landscape instead. Generators include layered noise terrain with seeded caves, splines you draw in the viewport and extrude, primitives, and runtime voxelisation of static meshes with exact surface normals. Surfaces come from Surface Nets for smooth terrain, or Dual Contouring to keep mesh edges sharp. Per-voxel material index reaches your material through vertex colour.
Terrain mode
A volume can take its ground from a landscape. Nothing renders until the first dig; from then on the dug columns render as voxels and collision is lowered underneath. Choose how the landscape surface is hidden: Material Mask (per-column holes via MF_VoxelHoleMask in the landscape material), Hide Landscape Components (whole components hidden, no material setup), or None (landscape stays visible). Heights come from a pristine snapshot, so PIE sessions and reloads always rebuild the same ground. See the installation guide for setup.
Top-Down Mode
For fixed overhead and isometric cameras, where a cave roof would otherwise hide the player entirely. When the local player moves under solid ground, the volume re-meshes the chunks above them with the roof cut away, and an optional floor plane fills in beneath — so an excavation stays readable from outside.
Nothing replicates
Purely visual and entirely local. Collision is untouched, other players see the volume unchanged, and a dedicated server skips the work — it has no camera and nothing to hide.
Procedural caves keep their roof
Only voxels that were solid in the baseline and are air now count as excavated. Caves the generator authored stay roofed and dark, so a cave system is not unroofed across the whole map.
The transition animates rather than blends: the cut slides down from the surface over a configurable number of steps, each one ordinary opaque geometry, so nothing is ever dithered or drawn twice. Two Blueprint events fire as the local player enters and leaves, for swapping ambience or post-process. See the installation guide for setup.
Editing
Brush presets
Sphere or box, dig, fill, paint, smooth, with radius, strength, falloff, material and cooldown.
Deterministic ops
Edits are quantised to integers end to end, so every machine that applies the same op gets the same voxels.
Queries and rules
Line traces against voxels, edit events with per-material counts, an authorizer interface for gameplay rules, and a material set for names, tool/yield ids and a gameplay tag.
Replication and prediction
Small ops
Edits replicate as compact ops rather than full chunk payloads. Late joiners catch up from compressed chunk snapshots under a byte budget.
Client prediction
Dig and fill predict locally with server rollback when an edit is rejected. Range and rate limits apply per player on the authority.
Both drivers
Works with the legacy replication driver and Iris. No game code required beyond calling the subsystem from your input.
Thirty-two players, digging at once
One dig on its own is cheap. The case that decides whether a sandbox holds up is every player on the server digging continuously — ten times a second, for a solid minute, into the same 256-metre volume. Nobody idles, nobody pauses, and nothing is amortised away.
At thirty-two simultaneous diggers that is 2.7 million voxels destroyed in sixty seconds — about 45,500 every second — and the cost grows roughly in step with the player count rather than running away with it.
Cost at the 99th percentile
All measurements
| Players | Edits applied | Mean | Median | p95 | p99 |
|---|---|---|---|---|---|
| 8 | 4,796 | 1.91 ms | 1.66 ms | 3.36 ms | 4.74 ms |
| 16 | 9,589 | 3.33 ms | 2.99 ms | 6.50 ms | 9.20 ms |
| 32 | 19,176 | 5.70 ms | 5.05 ms | 10.55 ms | 12.53 ms |
Median of three repeat runs. The edit counts are not rounded and not averaged — all three runs applied exactly 4,796, 9,589 and 19,176 edits. Identical input, identical result, run after run: that is the determinism the replication model depends on, showing up in the measurements rather than being asserted.
What it costs to send
An edit crosses the wire as a compact op of roughly 60 bytes — the changed fields plus the replication overhead Unreal wraps around them — rather than a chunk resync. What that totals on your server depends on how many players dig at once and how hard, so measure it against your own population rather than scaling ours.
Arriving late
A player joining a world with 9,591 edits already in the ground pulls 160 KB and is current 2.5 seconds later, at the default snapshot budget. No pause, no half-built world.
Untouched ground is free
A 1,024-chunk volume loads with zero chunks in memory — ground nobody has dug stays procedural and costs nothing. After 4,792 edits only 180 chunks had materialised, for 11.25 MB of voxel storage.
AMD Ryzen 9 7900X (12 cores, 24 threads, 4.7 GHz boost), 63 GB RAM, Windows 11, Unreal Engine 5.8. A single 1,024-chunk volume, 256 m square at 50 cm voxels. Each simulated player issues ten digs per second for sixty seconds with no idle time, and every figure is the median of three repeat runs. Rendering was disabled for the capture, so these are game-thread CPU costs and not frame rates. Debris and LOD were not exercised by this suite and no claim is made about them here.
Scale and debris
LOD and streaming
Three LODs with seam snapping between them, far regions that batch distant chunks into one mesh, async meshing and collision on worker threads, and World Partition streaming per volume. Meshing a 32³ chunk costs ~0.3 ms on a worker; dedicated servers build collision only.
Breaking debris
After a dig, pieces no longer connected to the volume are detected, removed on every machine and spawned as physics actors with a convex hull, replicated movement, mass from their volume, and a lifetime. Detection costs ~0.3 ms on the game thread; meshes and hulls build on workers.
Editor tools
Voxel Sculpt mode lets you drag in the viewport to dig, fill and paint placed blob volumes; each stroke is one undo step and the result is saved with the level. Live preview of blob volumes, a bounds wireframe, a cave preview toggle, and a debug-draw console variable show chunk states, LODs and terrain columns.
Known limitations
Landscape grass and foliage are not removed over holes; listen to edit events and clear them in the game. The sculpt editor mode works on blob volumes; terrain volumes are edited in play. Debris uses one convex hull per piece. Static-mesh features thinner than two voxels disappear at that voxel size.
Requirements
Unreal Engine 5.8. Blueprint or C++ project. No third-party libraries and no other plugins required. See the installation guide for setup, every parameter, and troubleshooting.
Try it on your own world
The timings above come from one machine and one content setup, and yours will not match. Drop a volume in your map, wire dig input from your PlayerController, and tune voxel size, LOD and snapshot bandwidth against your own hardware and player count rather than these — stat ButterNetVoxels and the debug draw commands show the costs live.