← Back to Blog 3d-modeling

Batch Exporting 3D Assets from Blender: Automate Your Pipeline for Unity, Unreal Engine 5, and Godot 4

By BitSoul Team5/9/2026Updated 8/2/20265 min read83 views
Batch Exporting 3D Assets from Blender: Automate Your Pipeline for Unity, Unreal Engine 5, and Godot 4

If you're manually exporting game assets one by one from Blender, you're leaving hours on the table every week. A 50-asset environment pack can take the better part of a day to push out individually — adjusting settings, renaming files, flipping axes. Automate it once, and you'll never do it by hand again.

Why Batch Exporting Matters for Game Asset Pipelines

Manual exports kill iteration speed. Every time you tweak a mesh, fix a UV seam, or adjust a pivot point, you're back to File → Export → navigate to folder → confirm settings → wait → repeat. Multiply that by 30, 50, or 200 assets and the friction compounds fast.

Batch exporting solves three concrete problems:

Whether you're targeting Unity's left-handed Y-up coordinate system, Unreal Engine 5's right-handed Z-up, or Godot 4's Y-up with its own quirks around FBX, a batch script handles all the axis swaps and unit scale conversions automatically.

Setting Up Blender for Batch Export with Python Scripts

Setting Up Blender for Batch Export with Python Scripts — illustrated

Blender's Python API (`bpy`) gives you full control over the export pipeline. The Scripting workspace (Shift+F4 or via the workspace tabs) gives you a text editor wired directly into Blender's live Python environment. Start here.

The core pattern for any batch exporter is: iterate over objects or collections, select one at a time, call the appropriate export operator, deselect. The export settings themselves live in a plain dictionary — for Unity that means `axis_forward: "-Z"`, `axis_up: "Y"`, unit scale applied with `FBX_SCALE_ALL`, modifiers applied, leaf bones off, and textures referenced rather than embedded. With the settings defined once, the exporter itself is a few lines:

```python
def export_object_as_fbx(obj, export_dir, settings):
filepath = os.path.join(export_dir, f"{obj.name}.fbx")
bpy.ops.object.select_all(action="DESELECT")
obj.select_set(True)
bpy.context.view_layer.objects.active = obj
bpy.ops.export_scene.fbx(filepath=filepath, use_selection=True, **settings)

os.makedirs(EXPORT_DIR, exist_ok=True)
for obj in bpy.data.objects:
if obj.type == "MESH" and not obj.hide_get():
export_object_as_fbx(obj, EXPORT_DIR, UNITY_SETTINGS)
```

Run this from the Text Editor (Alt+P or the Run Script button). Every visible mesh in the scene exports as its own FBX with Unity-correct axis settings. For Unreal Engine 5, swap `axis_forward` to `X` and `axis_up` to `Z`. For GLB output targeting Godot 4, replace `bpy.ops.export_scene.fbx` with `bpy.ops.export_scene.gltf` and adjust the relevant kwargs.

One important note: if your objects have unapplied scale (visible as non-1.0 values in the N-panel), add `bpy.ops.object.transform_apply(scale=True)` before the export call — or you'll get inconsistent sizes in-engine.

Export Presets for Unity, Unreal Engine 5, and Godot 4

Rather than hardcoding settings per-run, store your engine targets as named preset dictionaries — `"unity"`, `"unreal"`, `"godot"` — and select one at call time. This makes your script engine-agnostic and easy to share across a team: the Unity preset carries the FBX axis settings above, the Unreal preset flips the axes and raises `global_scale` to `100.0` with `FBX_SCALE_NONE`, and the Godot preset switches to the glTF exporter with `export_format: "GLB"`, `export_apply: True`, and `export_yup: True`.

The Unreal scale deserves a highlight: UE5 works in centimeters, Blender in meters. Without `global_scale: 100.0`, your assets import at 1% scale and you'll spend an afternoon wondering why everything looks like a toy. The `FBX_SCALE_NONE` setting keeps the scale factor embedded in the FBX itself, which UE5 reads correctly on import.

A comparison of what changes between engines:

| Setting | Unity | Unreal Engine 5 | Godot 4 |
|---|---|---|---|
| Forward axis | -Z | X | -Z |
| Up axis | Y | Z | Y |
| Unit scale | 1.0 | 100.0 | 1.0 |
| Preferred format | FBX | FBX | GLB/GLTF |
| Apply modifiers | Yes | Yes | Yes |
| Leaf bones | No | No | No |

Organizing Collections for Batch Export

Organizing Collections for Batch Export — illustrated

A script that iterates over every object in a scene quickly becomes unmanageable on large projects. The better pattern is to organize assets into named Blender Collections and export by collection. This mirrors how game engines organize assets into folders.

Name your collections with export intent built in: `EXPORT_props`, `EXPORT_weapons`, `EXPORT_env`. Then filter by prefix:

```python
EXPORT_PREFIX = "EXPORT_"

for collection in bpy.data.collections:
if not collection.name.startswith(EXPORT_PREFIX):
continue
target_dir = os.path.join(EXPORT_DIR, collection.name[len(EXPORT_PREFIX):])
os.makedirs(target_dir, exist_ok=True)
for obj in collection.objects:
if obj.type == "MESH":
export_object_as_fbx(obj, target_dir, PRESETS["unity"])
```

This gives you a folder per collection in your export directory — `props/`, `weapons/`, `env/` — which maps directly to Unity's Project window or UE5's Content Browser folders. Import the folder once into your engine; subsequent batch exports overwrite the files in place and the engine reimports automatically (Unity) or prompts for reimport (UE5).

Keep non-export objects in collections without the prefix: `_reference`, `_proxy`, `_rig`. They stay invisible to the batch script.

Automating LOD and Naming Convention Checks Before Export

The last thing you want is to publish assets to BitSoul's marketplace or push to an engine project with broken naming conventions or missing LODs. Add a validation pass before the export loop. Two checks catch most problems: every mesh name should match your naming convention (a regex like `^SM_[A-Za-z0-9_]+$` for static meshes), and every mesh over your poly budget should have a `_LOD1` sibling in the file:

```python
issues, missing_lods = [], []
for obj in bpy.data.objects:
if obj.type != "MESH":
continue
if not re.match(r'^SM_[A-Za-z0-9_]+$', obj.name):
issues.append(obj.name)
polys = len(obj.data.polygons)
if polys > 5000 and (obj.name + "_LOD1") not in bpy.data.objects:
missing_lods.append(f"{obj.name} ({polys} polys)")

if not issues and not missing_lods:
run_export() # only export a clean scene
```

This pre-flight check surfaces problems before they reach your engine or your customers. Adjust the naming regex and poly thresholds to match your pipeline's conventions.

A solid batch export script is the difference between a professional asset pipeline and a manual grind. Build it once, parameterize for your target engines, and you'll reclaim hours every sprint.

Tags: blender batch-export game-assets unity unreal-engine-5 godot-4 python-scripting workflow-automation

Skip the modelling — download it instead

A free BitSoul account gets you 2 game-ready models every month plus 25 AI Engine credits to generate one of your own, no card required. Clean topology, PBR textures, and GLB downloads that drop straight into Unreal, Unity, Godot or Blender — plus OBJ and 3D-printable STL export.

Create a free account → Browse 846 models