Quick answer: After SetSkeletalMesh or AnimBP swap, call InitializeAnimation() on the SkeletalMeshComponent. Cached poses from the previous skeleton/anim graph are invalid until re-init.
A character customization system swaps a skeletal mesh at runtime. The first frame after the swap renders frozen or T-posed before the anim catches up.
Why It Goes Stale
The Anim Instance keeps per-frame caches keyed to the skeleton it was initialized with. Swapping the mesh (especially to one with a different but compatible skeleton, or back to the same one) leaves those caches pointing at the old data for one frame.
Re-Init After Swap
SkeletalMesh->SetSkeletalMesh(NewMesh);
SkeletalMesh->InitializeAnimation();
InitializeAnimation rebuilds the AnimInstance state for the current skeleton. Do this in the same frame as the swap to avoid the one-frame visual blip.
Watch for Control Rig Bindings
If the character uses Control Rig, control bindings are bone-name-resolved at init — re-init pulls them fresh. Custom code that cached bone references must also re-resolve.
Pose Snapshots Don't Migrate
If you used a Pose Snapshot from the old skeleton, it’s invalid on the new one. Take a fresh snapshot after re-init if you need one.
Verifying
Swap meshes back-to-back — no T-pose blip, no frozen first frame. Control Rig effects still apply correctly post-swap.
“Mesh swap = anim cache stale. InitializeAnimation right after restores a coherent state.”
For full character swaps, also tick the AnimBP once manually before the next render so the new pose is ready — the cleanest no-blip switch.