Skip to content
PRODUCT GITHUB  ↗

Mesh Replication (UnrealNet)

When the UnrealNet plugin is installed alongside RMC Pro, managed meshes (URealtimeMeshSimple, URealtimeMeshProcedural, URealtimeMeshDynamic) can replicate their geometry automatically: set a mesh on the server, and every client receives it — no RPCs, no custom serialization code. There is no hard dependency in either direction: RMC works without UnrealNet (the feature is simply inert), and the integration binds at runtime through a versioned plugin contract.

  • Auto replication. A managed mesh set on a replicated actor’s URealtimeMeshComponent on the server streams to all clients, including geometry edits made later. Clients instantiate the same mesh class locally and apply updates through the normal update pipeline (rendering, bounds, and collision all behave as if built locally).
  • Coarse-first progressive LODs. Multi-LOD meshes send the lowest-quality LOD first, on its own prioritized stream, so clients render something immediately. Finer LODs appear as they finish arriving; each LOD stays hidden until it is complete, and the normal screen-size selection takes over as LODs fill in.
  • Late-join catch-up. Clients that join mid-session receive the current mesh state (again coarse-first), paced per client, while live edits continue broadcasting.
  • Efficient by construction. Edits are coalesced — rapid updates to the same section group serialize once, at the latest state — payloads are Oodle-compressed, and everything is paced by the transport’s backpressure so nothing queues unboundedly.
  1. Enable UnrealNet on both server and client builds (it must be enabled before connecting).
  2. Raise the engine’s default net rate caps (they cap throughput at ~100 KB/s otherwise) — see UnrealNet’s quickstart for the exact DefaultEngine.ini block.
  3. Make sure the owning actor replicates (bReplicates = true). That’s it: bReplicateMeshData on the component defaults to true.

To opt a component out, clear Replicate Mesh Data on the component (or call SetReplicateMeshData(false)). Project-wide options live under Project Settings → Plugins → Realtime Mesh Net Sync: master switch, payload compression, chunk size, per-LOD stream priorities, and whether collision configuration replicates.

  • The client-side mesh is a render replica created by the sync layer. Don’t edit it locally on clients; server state always wins.
  • Materials replicate as slot name + soft object path. Runtime material instances (MIDs) replicate too: the instance chain is flattened to its nearest asset parent plus the final scalar/vector/texture parameter overrides, and the client rebuilds a single MID over that parent. Runtime-created textures in parameters can’t replicate and are skipped. Live MID parameter changes are detected by a periodic server-side recheck (default every 0.25 s, configurable).
  • Collision replicates as configuration + per-section flags; clients cook collision locally (async).
  • URealtimeMeshDynamic replicas render correctly, but the client’s source UDynamicMesh is not reconstructed — only the converted render geometry travels.
  • Distance fields and Lumen card representations replicate automatically (after the geometry, so they never delay first render); clearing them on the server clears them on clients. Runtime Nanite resources do not replicate.
  • Everything is world-scoped: travel tears sessions down and they rebuild automatically in the new world.