Quick answer: Pass morph-target inclusion flags to FSkeletalMeshMerge, ensure source meshes have CPU access, and re-bind the merged morph curve names afterward.

A character customization system merges a body mesh with clothing meshes via FSkeletalMeshMerge. The merged result loses the body’s facial morph targets — expressions stop working.

Merge with Morphs

FSkeletalMeshMerge Merger(
    TargetMesh,
    SourceMeshes,
    Sections,
    StripTopLODs,
    EMeshBufferAccess::ForceCPUAndGPU,   // keep CPU access
    RefPoseOverride
);
Merger.DoMerge();

ForceCPUAndGPU keeps the data the merge needs. Pure GPU access can drop morph source data.

Source Mesh CPU Access

Each source SkeletalMesh asset: enable Allow CPU Access in its asset settings. The merge reads vertex/morph data CPU-side; without access, morphs are skipped.

Re-Bind Morph Curve Names

After merge, the AnimInstance drives morphs by curve name. Verify the merged mesh’s morph target names match what the anim graph expects:

MergedComp->SetMorphTarget(FName("Smile"), 1.0f);

If names changed during merge, remap them.

Verifying

Merge body + clothing. Facial expressions still animate. Morph targets show in the merged mesh’s asset details. No expression gaps.

“Merge drops what it can’t reach. Keep CPU access on, include morph flags, re-bind names.”

For heavy customization systems, consider Leader Pose Component instead of merging — separate meshes share a skeleton, morphs stay intact, no merge cost.