After following these and other leads I finally found a workaround. My Blender to UE4 pipeline finally works!
The main key difference to what you did is, I used an ACharacter as the base of my animated object, instead of just dropping the Animation Blueprint on the scene. From this ticket you commented on: https://answers.unrealengine.com/questions/227087/root-motion-seen-by-unreal-but-not-applied.html
Here’s all the steps, and maybe it will show why this really needs some work:
In Blender
- Before doing anything, set the scale to Metric 0.01. If you already had stuff, scale it up by 100 and apply scale.
- Don’t animate root motion in the root bone in pose mode. Animate the entire Armature in object mode for all root motions. This is because there is a flaw in Blender’s FBX exporter that exports the Armature as the root bone. Setting the root bone to 0,0,0 does not solve this.
- Export the FBX using the Binary version. ASCII wouldn’t even import for me. Also might as well set the smoothing to edge, and save the operator preset because every time you open a new Blender session it will revert back to wrong.
- Import into UE4, I imported all, including Animations and Skeleton, but not the materials (but that doesn’t matter)
- Open the Animation, check the “Enable Root Motion” box, (Ref Pose, Anim First Frame, and Zero all work for me) Click “Show” in the viewport and choose “Process Root Motion”. At this point everything should look good. And your mesh should animate off screen and then appear on the other side of the screen.
- Create a new Animation Blueprint.
- Edit the Animation Blueprint defaults, set Root Motion Mode to “Root Motion from Everything”
- Add the animation to the graph, and connect it to Final Pose.
- Create an ACharacter blueprint. Change the Mesh > Skeletal Mesh to your imported Skeletal Mesh. Move it down about -85 on the z to compensate for the capsule component’s center. This is totally a hack (my thing is not a Character), but it works.
The correct way is probably to do [what Genetic Spartain said][5] and make your own Class with this code:
FRootMotionMovementParams RootMotion = Mesh->ConsumeRootMotion();
if (RootMotion.bHasRootMotion)
{
FTransform WorldRootMotion = Mesh->ConvertLocalRootMotionToWorld(RootMotion.RootMotionTransform);
UpdatedComponent->SetWorldLocation(UpdatedComponent->GetComponentLocation() + WorldRootMotion.GetTranslation());
}