Apply All Transforms
Select all objects (A), then Ctrl+A → All Transforms. This bakes position, rotation, and scale into the mesh data so the object reads as (0,0,0) position, (0,0,0) rotation, and (1,1,1) scale in the outliner. Without this, Unity receives the raw transform offsets and the model's proportions, position, or orientation will be wrong.
Apply All Modifiers
Modifiers (Mirror, Subdivision, Solidify, Boolean, Array, etc.) are Blender-only constructs. The FBX exporter operates on the base mesh, not the modified result. For each modifier in the stack:
- Hover over the modifier panel
- Click the dropdown arrow → Apply (or Ctrl+A in the modifier dropdown)
- Work top-to-bottom — order matters for stacked modifiers
If the FBX export dialog has Apply Modifiers checked, it applies them at export time. But it's safer to apply manually so you can verify the result before exporting.
Clean Hierarchy
Your scene should contain only what you're exporting. Delete unused objects — especially Blender's default Cube, Camera, and Light. If your model is animated, the hierarchy should be:
- Armature (parent)
- Mesh (child, parented with Armature Deform)
Extra objects in the scene get exported into the FBX and appear as unwanted GameObjects in Unity.
Set Origin
The object's origin in Blender becomes the pivot point in Unity. Set it intentionally:
- Object → Set Origin → Origin to Geometry — centers the origin inside the mesh bounding box
- Object → Set Origin → Origin to 3D Cursor — place the 3D cursor at world origin (Shift+S → Cursor to World Origin) first, then set origin to cursor. This puts the pivot at the model's feet, which is usually what you want for game characters.
Verify Scale
In the Properties panel (N), check that Scale reads 1.000 on all axes. If it doesn't, apply transforms first (Ctrl+A → All Transforms). A non-uniform scale that isn't applied will cause stretching or squishing in Unity.
| Setting | Value | Why |
|---|---|---|
| Path Mode | Auto | Resolves texture paths automatically |
| Forward | -Z Forward | Matches Unity's coordinate system (Unity forward is +Z, Blender's -Y maps to -Z) |
| Up | Y Up | Unity uses Y-up (Blender uses Z-up) |
| Apply Scalings | FBX All | Bakes scale into geometry so no runtime conversion is needed |
| Apply Transform | ON | Bakes axis conversion into the mesh data |
| Selected Objects | Recommended | Export only what you need — prevents scene junk (cameras, lights, helpers) from leaking in |
| Apply Modifiers | ON | Exports the final mesh result, not the base mesh before modifiers |
| Add Leaf Bones | OFF | Unity ignores leaf bones — they only add clutter to the bone hierarchy |
| Bake Animation | ON | Required if the FBX contains animations. Bakes constraint results into keyframes. |
| NLA Strips | OFF (usually) | Unless using NLA workflow for multiple actions. Frame-range splitting is simpler. |
Root Bone Rules
The root bone (the topmost bone in your armature hierarchy) must stay at (0, 0, 0) with (0, 0, 0) rotation for the entire animation. It serves as a stable anchor point.
- No location keyframes on the root bone — these cause the model to float above or sink below its collider
- No rotation keyframes on the root bone — these cause the model to spin, and the rotation accumulates with each animation loop
- All visible animation (squash, stretch, bounce, limb movement) goes on child bones below the root
Converting Moving Animation to In-Place
If you already have an animation with root bone movement, you can strip it without redoing the animation:
- Select the Armature and enter Pose Mode (Ctrl+Tab)
- Select the root bone
- Open the Graph Editor or Dope Sheet
- Find the root bone's Location and Rotation channels
- Select all keyframes on those channels (A to select all within the channel)
- Delete them (X → Delete Keyframes)
- Child bone keyframes remain intact — the visible animation is preserved, minus the root travel
Multiple Animations in One File
Use frame range separation within a single Action. Leave 2–3 frame gaps between clips to prevent blending artifacts:
- Idle: frames 0–30
- Walk: frames 33–61
- Attack: frames 65–90
- Death: frames 93–120
Document your frame ranges in a text file or spreadsheet so the developer importing in Unity knows where to split clips. The frame numbers map directly to Unity's Animation tab clip splitting.
Baking Constraints
If your animation uses IK solvers, Track-To, Copy Rotation, or other constraints, you must bake them to raw keyframes before export. The FBX format doesn't support Blender's constraint system.
- Select the Armature
- Enter Pose Mode
- Select all bones (A)
- Go to Object menu (in header) → Animation → Bake Action
- Check Visual Keying (bakes the visual result of constraints, not the raw values)
- Check Clear Constraints (removes constraints after baking so they don't interfere)
- Set the frame range to match your animation
- Click Bake
NLA Strips
An alternative to frame-range splitting: push each Action down to an NLA strip. The FBX exporter can export all NLA strips as separate takes, which Unity reads as separate clips automatically. However, the simpler approach is using frame ranges in a single Action — it's easier to manage and less error-prone. Use NLA only if you have a complex multi-action workflow.
| Setting | Tab | Value | Why |
|---|---|---|---|
| Scale Factor | Model | 1 | Match Blender's 1:1 unit scale |
| Use File Scale | Model | OFF | Use Unity's Scale Factor value instead of whatever the FBX file declares |
| Bake Axis Conversion | Model | ON | Bakes the Z-up to Y-up rotation into vertex data at import time. Without this, models appear sideways and require a runtime -90 X rotation hack. |
| Import Cameras | Model | OFF | Blender's default Camera silently overrides the Main Camera — causes gray skybox, wrong angles, and mirrored UI on scene reload |
| Import Lights | Model | OFF | Blender's default Light creates unwanted scene lighting |
| Animation Type | Rig | Generic | For non-humanoid characters (enemies, props). Use Humanoid only for human-proportioned characters with standard bone names. |
| Avatar Definition | Rig | Create From This Model | Generates the Avatar asset needed by the Animator component. Without this, the Animator has no avatar and animations won't play. |
| Import Animation | Animation | ON | Enable if the FBX contains animation clips. Leave OFF for static meshes. |
SceneManager.LoadScene. Always disable it.Splitting Clips
In the FBX Inspector → Animation tab, you'll see a default clip covering the full frame range. To split it into individual clips:
- Click the + button under the clips list to add a new clip definition
- Name each clip clearly (e.g.,
idle,walk_static,attack) - Set Start and End frames matching the Blender frame ranges from the artist's notes
- Repeat for each animation in the FBX
- Click Apply to reimport with the new clip definitions
Loop Settings
Each clip has loop settings that control how it repeats. These are critical for preventing drift.
| Setting | What It Does | When to Use |
|---|---|---|
| Loop Time | Clip repeats continuously | Walk cycles, idles, any repeating animation |
| Loop Blend | Smoothly blends last frame back to first | Most looping animations — prevents popping at the loop boundary |
| Loop Blend Position Y | Clamps vertical drift over loop | When animation drifts up or down over the cycle |
| Loop Blend Position XZ | Clamps horizontal drift | When animation drifts sideways over the cycle |
| Loop Blend Orientation | Clamps rotation drift | When animation slowly rotates over the cycle |
| Keep Original Position Y | Preserves the Y offset from Blender | Usually ON — keeps model at correct height relative to the ground |
Creating and Assigning a Controller
- In the Project window, right-click in the target folder → Create → Animator Controller. Name it descriptively (e.g.,
SlimeAnimator). - Double-click the controller to open the Animator window. You'll see the default Entry, Any State, and Exit nodes.
- Expand your FBX asset in the Project window by clicking the arrow. This reveals the animation sub-assets (clips) and the Avatar.
- Drag a clip from the FBX sub-assets into the Animator window. The first clip you add becomes the default state (shown in orange). This is the animation that plays on start.
- Drag additional clips for other states. Right-click states to create Transitions between them.
- On your prefab or GameObject, select it and find (or add) the Animator component in the Inspector.
- Assign the controller to the Animator's Controller field.
- Assign the Avatar from your FBX to the Animator's Avatar field. Click the circle picker button, then find your model's avatar (it will be named like
YourModelAvatar). - Set Apply Root Motion to OFF. Our enemies and characters use physics-driven movement (
Rigidbody), not animation-driven root motion.
fileIdsGeneration changes between imports. Fix: re-assign the prefab field using the FBX root GameObject directly (type: 3 in YAML, not type: 2). Never reference intermediate PrefabInstance wrappers.bakeAxisConversion, the model appears rotated 90 degrees on the X axis. Fix: in the FBX import settings (Model tab), enable Bake Axis Conversion. This bakes the rotation into mesh vertices at import time instead of requiring a runtime rotation hack.