DOCUMENTATION

Blender and Unreal

Model in Blender and use the result in Unreal, in one call each way. The MCP server drives both editors: it exports from one, imports into the other through the engine's own importer, and reads the asset back before it answers. You need the Unreal plugin, the MifBlender add-on and the MCP server, with both editors open.

One mesh, or several as one asset

mif_send_to_unreal takes Blender object names and a content folder, and makes one static mesh:

  • The pivot is the first object's origin. Its location and rotation are left out of the file and its scale is kept, so the asset is the size it looks in Blender.
  • Collision travels with it. A mesh named UCX_<object> (or UBX_, USP_, UCP_) in the scene becomes the asset's collision, and Unreal's automatic collision is switched off.
  • Lightmap UVs are taken from the mesh when it carries a second UV layer, which every procedural builder writes, and generated by Unreal when it does not.
  • A name already taken is refused with a free name to use instead. Sending again over an asset the hand-off made replaces it in place, so placed actors show the new mesh.
  • place puts an actor where the first object stood, converted to Unreal's axes. save writes the asset to disk; by default it stays in memory until the editor saves it.

The other way, mif_send_to_blender exports a static or skeletal mesh from Unreal and imports it into the open Blender scene, which is not cleared, then checks the object against the asset's own box. A skeletal mesh arrives with its armature, skin and morph targets, checked against Unreal's own reads; Blender 3.6's FBX importer cannot read the morph targets, and the send says so.

A whole kit in one call

From 1.2, kit (or a collection, its child collections included) sends every mesh as its own static mesh in one folder, each named for its object, round its own origin, with its own collision hulls. Every piece is checked before any is written, and every problem is named at once: a name Unreal refuses, two names that differ only in case, an asset already there, a mesh with no UV layer, loose geometry or zero-area faces. The answer lists each piece's asset, hulls, bounds and triangles.

skinned (or skeleton, naming an existing Skeleton) sends skinned meshes with their armature as a SkeletalMesh, on that Skeleton when it fits.

Getting a piece ready first

bl_recipe_game_ready does the pass a piece needs before it leaves Blender: the pivot placed by the piece's kind (a floor on a bottom corner, a wall on the bottom of its face, a prop at its bottom center), a lightmap UV layer checked ready, an SM_ name with its hulls renamed to match, and collision hulls (a box per part for a wall or floor, so a doorway stays open, and convex for a prop). It answers with bl_mesh_quality's conventions check, each difference a note with its number. bl_build_lod_chain makes a LOD chain and can write it, with the collision hulls, to one FBX that Unreal imports as one static mesh with those LODs.

What the read-back checks

The call fails when Unreal holds something other than what was written. It counts before it measures: the triangles, and the material sections against the materials the faces use, then the asset's box against the written box (with Blender's Y turned into Unreal's), its material slots and its collision.

1.2 fixed a case that check now catches by name. Replacing an asset that an earlier replace had imported through Interchange (UE 5.5 and later) ran the next import with the FBX importer's own defaults, and the asset kept only the first object: 960 of 2,216 triangles, one section of four. The hand-off now gives such an asset this import's mesh options first, and a dropped object is reported as one, naming the objects whose triangles did not arrive. A replaced asset that fails its read-back is still kept, because the old one is gone and actors point at the path, and the answer says so with matchesSend: false.

What it does not check

Vertex color values, UVs and normals are carried but not compared, and Blender's node materials arrive as plain Unreal materials named after them. A tree from bl_build_tree, sent with tree, is the exception: its bark and leaf materials are built in Unreal, with wind on the leaves.