The disconnect between Blender's animation preview and what you actually see after importing into Unity or Godot is one of those things that never fully goes away no matter how long you've been doing this. You get the timing right in the viewport, export the FBX, and something feels just slightly off on the other side.
The most common culprit in my experience is interpolation. Blender's F-curves default to Bezier with auto-handles, which creates smooth ease-in/ease-out on everything. Unity's Animator imports curves and tries to preserve the Bezier tangents, but the reconstruction isn't perfect, especially on curves with tight timing or extreme handle angles. Godot is even more aggressive: depending on your import settings, it can snap curves to linear, and if you haven't explicitly enabled import as Bezier you're suddenly getting hard steps between keys and wondering why everything feels robotic.
The frame rate mismatch is real too, and people don't talk about it enough. If Blender is set to 24fps and your engine runs at 60fps, the engine interpolates between keyframes at a much finer resolution than you timed for. A snappy smear you built around hitting on a specific frame doesn't land the same way. My workaround has been to just work at 60fps in Blender, controversial maybe, but it's the only thing that's actually kept timing consistent for me.
Root motion is its own category of pain. Blender doesn't have a native root motion extraction system the way Unity does. You animate movement in world space, then you're either baking it into a dedicated root bone before export or relying on Unity's Animator to extract it, and both approaches can introduce subtle timing drift if your root bone has any sub-frame offsets or the extraction settings don't match your intent.
I've been thinking about writing a small preflight checker, a Blender script that validates keyframe timing against a target frame rate and flags keys that fall between engine frames. Something to catch the obvious mismatches before export rather than after. Has anyone built something like this, or found a cleaner way to keep Blender preview and in-engine playback genuinely aligned?