Migration Notes
This page covers behavior changes that can affect an existing project when upgrading to v5.4 — not new features (see the changelog for those). Read through it before upgrading a shipping project, particularly the replication change below, which is silent unless you’re looking for it.
Actor replication is now opt-in
Section titled “Actor replication is now opt-in”Previously, ARealtimeMeshActor::BeginPlay force-enabled replication on every RealtimeMesh actor by calling SetReplicates(true) unconditionally. It now respects the actor’s configured bReplicates value instead — the remote role and physics replication mode are only wired up when bReplicates is already true on the authority.
This is a silent behavior change if your project relied on the old automatic replication:
- If your RealtimeMesh actors need to replicate, set
bReplicates = trueexplicitly on your actor’s class defaults, Blueprint, or the placed actor’s details — the same as any other actor. - Actors that never needed replication get the benefit of no longer being forced into the replication graph.
Distance-field and Lumen card generators are removed
Section titled “Distance-field and Lumen card generators are removed”URealtimeMeshDistanceFieldGeneration and URealtimeMeshCardRepresentationGenerator (formerly in RealtimeMeshExt) have been removed. They spent an interim period as deprecated shims that funneled into the shared SDF core; that shim layer is now gone and calls to the old classes no longer compile.
Replacements:
URealtimeMeshSDFLibraryfor the high-level “apply to mesh” flows.- The
RealtimeMesh::SDFAPI inRealtimeMeshSDFdirectly:GenerateDistanceFieldCPU+PackToDistanceFieldVolumeDatafor distance fields,GenerateCardRepresentationCPUfor Lumen cards, and their...Asyncvariants.
Behavior notes when migrating from the old generators:
- Output is engine-equivalent, not bit-identical to the old generators — the same
FDistanceFieldVolumeData/FMeshCardsBuildDataformats come out, but exact values can differ. Don’t rely on byte-for-byte reproducibility of prior output. - There is no pre-built BVH input — the core always builds its own BVH internally.
- Card generation derives bounds from the mesh (no distance-field input), and returns Failure (rather than a zero-card Success) when no cards can be produced.
- The old
bUsePointQuery/bMultiThreadedGenerationstyle options have no equivalent — generation is always BVH-based and internally parallelized.
RealtimeMeshNoExportTypes.h is removed
Section titled “RealtimeMeshNoExportTypes.h is removed”The key/config/collision structs and enums it mirrored are now reflected directly at their native declarations in the Core/*.h headers. Struct paths and reflected fields are unchanged, so existing Blueprint assets load as before — but if your C++ includes RealtimeMeshNoExportTypes.h directly, include the relevant Core/*.h header instead (most code already gets these transitively). This change also fixes Blueprint memory corruption caused by the old mirrors’ wrong-size struct registration.
Corrected default for bForceOpaque
Section titled “Corrected default for bForceOpaque”The Blueprint/editor-reflected default for FRealtimeMeshSectionConfig::bForceOpaque previously showed as true, even though the native C++ default has always been false. This was a drift between the native struct and its editor-reflected mirror, now fixed — the reflected default is false, matching the native default and matching actual runtime behavior (sections have always been constructed with bForceOpaque = false).
Runtime behavior does not change. If a Blueprint graph read the previously-displayed true default and depended on it, set the value explicitly now that the displayed default has changed.
Pending for the next release
Section titled “Pending for the next release”Two changes are landing that aren’t yet in a tagged release — flagging them now so they aren’t a surprise:
- Raw meshoptimizer includes are no longer supported. If any of your code includes
MeshOptimizer/meshoptimizer.hdirectly, switch to the canonicalRealtimeMeshMeshOptimizer.hinclude instead. The underlying library is vendored with a symbol prefix, and only the canonical header is guaranteed to resolve against it going forward. - Debug CVars are being renamed from
r.RealtimeMesh.Nanite.*tor.TriAxisNanite.RMC.*. Update any project config, console command bindings, or automation scripts that reference the old names.