Skip to content
← Back to Blog 3d-modeling

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

By BitSoul3D5 min read165 views

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.

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

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:

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:

SettingUnityUnreal Engine 5Godot 4
Forward axis-ZX-Z
Up axisYZY
Unit scale1.0100.01.0
Preferred formatFBXFBXGLB/GLTF
Apply modifiersYesYesYes
Leaf bonesNoNoNo

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:

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:

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.


Need drop-in assets for this workflow? Grab the 67-model Weapons Bundle on the BitSoul marketplace and drop them straight into your project.

Tags: weapons

Skip the modeling — download it instead

A free BitSoul3D account gets you 2 GLB downloads every month for personal use plus 25 one-time AI Engine credits, no card required. PBR-textured GLB downloads with a full 3D preview before you buy, for Unreal, Unity, Godot or Blender — OBJ and 3D-printable STL come with any purchase or paid plan.

Browse 1,051 models — from $4.99 → or start free (2 downloads a month)