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.