Importing content
Most "it looks wrong in Unreal" problems are import-settings problems. Know the Interchange
framework's data flow, the settings that change geometry and shading, and how assets store
their import provenance so reimport stays predictable.
When to use this skill
- Importing static meshes, skeletal meshes, textures, or audio from Blender, Maya, Substance
Painter, or other DCC tools.
- Wrong scale, rotation, flipped normals, or washed-out/over-saturated textures after import.
- Setting up skeleton assignment and morph targets for character assets.
- Writing automated batch import via
UInterchangeManager in C++, Blueprint, or Python.
- Customising an import pipeline (C++ subclass, Blueprint, or Python) to enforce project
conventions.
- Debugging why reimport does not pick up the expected source file or settings.
Pipelines: Interchange vs legacy
Interchange (default for FBX, glTF, GLB, OBJ, most images, audio)
is the modern framework. Every import passes through three stages:
- Translator — reads the file into a format-neutral
UInterchangeBaseNodeContainer (a
graph of UInterchangeBaseNode objects representing meshes, bones, textures, etc.).
- Pipeline stack — a user-configured ordered list of
UInterchangePipelineBase objects
that transform translator nodes into factory nodes (what to create, with what settings).
- Factory — a
UInterchangeFactoryBase subclass that creates the final UObject asset
(e.g. UInterchangeStaticMeshFactory, UInterchangeTextureFactory).
The legacy FBX importer (UFbxFactory / UnFbx::FFbxImporter) handles FBX only when
Interchange FBX is disabled. It has its own import dialog and options struct
(UFbxImportUI). Both paths record source file data in a UAssetImportData-derived object on
the asset.
See references/interchange-framework.md for a full
breakdown of all Interchange classes, module locations, and the factory six-step protocol.
Supported formats
| Asset type |
Interchange formats |
Legacy/other |
| Static mesh |
FBX, glTF, GLB, OBJ |
FBX (legacy) |
| Skeletal mesh + animation |
FBX, glTF, GLB |
FBX (legacy) |
| Texture |
PNG, TGA, JPEG, EXR, HDR, DDS, IES, PSD, BMP |
— |
| Audio |
WAV, AIF/AIFF, FLAC, OGG, OPUS, MP3 |
— |
| Scene / level import |
FBX, glTF, GLB, MaterialX |
FBX scene legacy |
FBX imports through Interchange by default in 5.8; revert to the legacy importer with the
console variable Interchange.FeatureFlags.Import.FBX 0 (and .ToLevel 0 for scene import).
Units, scale, and axes
Unreal world units are centimetres. Meshes exported at the wrong scale require
actor-level rescaling and break physics.
- FBX:
UInterchangeFbxTranslatorSettings::bConvertSceneUnit = true (default) converts to
cm automatically. Prefer exporting at 1 unit = 1 cm from the DCC.
- Axis: Unreal is left-handed, Z-up.
bConvertScene = true (default) remaps Y/Z from
right-handed sources. EInterchangeCoordinateSystemPolicy controls the exact strategy:
MatchUpForwardAxes (default), MatchUpAxis, or KeepXYZAxes.
- Apply all transforms / freeze rotation in the DCC before export; baked-in offsets
appear as permanent root-bone offsets on skeletal meshes.
Mesh import settings that matter
These map to properties on UInterchangeGenericMeshPipeline (Interchange) or
UFbxStaticMeshImportData / UFbxSkeletalMeshImportData (legacy):
| Setting |
Effect |
Common mistake |
Combine Static Meshes (CombineStaticMeshesBehavior) |
Merges all meshes in the file into one SM (All/VisibleOnly/DoNotCombine) |
Leave on DoNotCombine when file has multiple independent assets |
Normals / Tangents (Build > Recompute Normals/Tangents) |
Trust DCC normals vs let UE recompute |
Mismatch causes shading seams at UV splits |
Generate Lightmap UVs (bGenerateLightmapUVs) |
Auto-generates a second UV channel for Lightmass |
Needed for baked lighting; off for pure Lumen |
Build Nanite (bBuildNanite) |
Enables Nanite on static meshes |
On by default in 5.8 Interchange; disable for low-poly props |
| LOD Group |
Assigns Epic's LOD reduction presets |
Pick SmallProp, LargeDetail, etc. to match use case |
Collision (bCollision) |
Imports/generates simple collision |
Prefix meshes with UCX_, UBX_, USP_, UCP_ for custom shapes |
Skeletal mesh–specific:
- Skeleton (
CommonSkeletalMeshesAndAnimationsProperties) — reuse one skeleton asset
across compatible meshes so all animations are shareable.
- Import Content Type —
GeometryAndSkinningWeights, GeometryOnly, or
SkinningWeightsOnly. Split imports can be parallelised for large character updates.
- Import Morph Targets — imports blend shapes from FBX/glTF morph target data.
- Create Physics Asset — auto-generates a
UPhysicsAsset if none exists.
See references/mesh-and-texture-import.md for the
full mesh and texture settings reference with source-verified property names.
Texture import settings that matter
| Setting |
Correct value |
Consequence of wrong value |
| sRGB |
ON for color/albedo; OFF for data maps |
Data maps (normal, roughness, metallic, masks) with sRGB ON look wrong in lighting |
| Compression |
Default (BC1/BC3) for color; Normalmap (BC5) for normals; Masks; HDR for EXR/HDR |
Wrong compression costs memory or quality |
| Flip Normal Map Green Channel |
Match DCC convention (on for Maya/DirectX, off for Blender/OpenGL-style) |
Specular highlight in wrong direction |
| Detect Normal Map Texture |
ON (default) |
Leave on; it sets sRGB=false and compression=Normalmap automatically |
UDIM (bImportUDIMs) |
ON for assets with UDIM naming (_1001, _1002, …) |
Multi-tile textures import as separate unrelated assets |
Texture compression and LOD group are stored on the UTexture2D asset; change them in the
Texture Editor or set them in a custom pipeline's ExecutePostFactoryPipeline.
Import asset data and reimport
Every imported asset stores provenance in a UAssetImportData-derived subobject:
- Interchange path:
UInterchangeAssetImportData (subclass of UAssetImportData)
stores the source file path, the translator settings, the pipeline list, and the node
container snapshot. Accessible with UInterchangeAssetImportData::GetFromObject(Asset).
- Legacy FBX path:
UFbxAssetImportData / UFbxStaticMeshImportData (subclasses of
UAssetImportData).
- The base class
UAssetImportData stores source file path, timestamp, and MD5 hash in
FAssetImportInfo::FSourceFile entries — enabling reimport to detect stale files.
Reimport replays the same pipeline stack and settings stored in the import data. Call
UInterchangeManager::ReimportAsset / ReimportAssetAsync programmatically; the manager
reads UInterchangeAssetImportData to resolve the original source file.
See references/reimport-and-import-data.md for the
full reimport workflow, programmatic API examples, and how to migrate legacy FBX import data.
Programmatic import via C++
// Create a source data handle pointing to a file on disk.
UInterchangeSourceData* Src =
UInterchangeManager::CreateSourceData(TEXT("D:/Art/Rock.glb"));
// Build import parameters.
FImportAssetParameters Params;
Params.bIsAutomated = true; // suppress dialogs
// Synchronous import (editor-only; blocking on game thread).
UInterchangeManager& Mgr = UInterchangeManager::GetInterchangeManager();
TArray<UObject*> Imported;
Mgr.ImportAsset(TEXT("/Game/Meshes"), Src, Params, Imported);
// Async import with a completion callback.
UE::Interchange::FAssetImportResultRef Result =
Mgr.ImportAssetAsync(TEXT("/Game/Meshes"), Src, Params);
Result->OnDone([](UE::Interchange::FImportResult& R)
{
for (UObject* Obj : R.GetImportedObjects())
{
UE_LOG(LogTemp, Log, TEXT("Imported: %s"), *Obj->GetName());
}
});
Key API points:
UInterchangeManager is a singleton; use GetInterchangeManager() (native) or
GetInterchangeManagerScripted() (Blueprint/Python callable).
FImportAssetParameters::OverridePipelines accepts a list of FSoftObjectPaths to bypass
the project-default pipeline stack with a custom one.
FImportAssetParameters::bIsAutomated = true prevents any modal dialog from opening —
essential for unattended batch import.
- For runtime import in a cooked build, the
Interchange content folder must be added to
Project Settings > Packaging > Additional Asset Directories to Cook.
Writing a custom pipeline in C++
Subclass UInterchangePipelineBase and override the virtual pipeline hooks:
// MyImportPipeline.h
#pragma once
#include "InterchangePipelineBase.h"
#include "MyImportPipeline.generated.h"
UCLASS(BlueprintType, editinlinenew)
class MYMODULE_API UMyImportPipeline : public UInterchangePipelineBase
{
GENERATED_BODY()
/** Shown in the Interchange dialog; locked during reimport. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "My Settings",
meta = (ReimportRestrict = "true"))
bool bEnforceNamingConvention = true;
protected:
virtual void ExecutePipeline(
UInterchangeBaseNodeContainer* NodeContainer,
const TArray<UInterchangeSourceData*>& SourceDatas,
const FString& ContentBasePath) override;
virtual void ExecutePostFactoryPipeline(
const UInterchangeBaseNodeContainer* NodeContainer,
const FString& FactoryNodeKey,
UObject* CreatedAsset,
bool bIsAReimport) override;
};
ExecutePipeline fires after translation; add/modify factory nodes to control what assets
get created and with what settings.
ExecutePostFactoryPipeline fires after the factory creates the asset but before
PostEditChange; modify the live UObject here.
ExecutePostImportPipeline fires after PostEditChange and async build; use for
post-build fixups (e.g. setting socket transforms that depend on render data).
- Mark properties
ReimportRestrict = "true" to prevent them being changed during reimport.
Register the pipeline asset in your project's pipeline stack via Project Settings >
Engine > Interchange or pass it via FImportAssetParameters::OverridePipelines.
Naming conventions
SM_ static mesh · SK_ skeletal mesh · SKEL_ skeleton · T_ texture · M_ material ·
MI_ material instance · A_ / S_ sound · BP_ Blueprint · DA_ data asset ·
DT_ data table. Consistent prefixes make content browsable and scriptable.
Gotchas
- Wrong scale — almost always DCC export units or
bConvertSceneUnit mismatch; fix at
source, not by scaling actors. A 100× scale error is common when Blender units = meters.
- sRGB on for normal/data maps → wrong lighting;
bDetectNormalMapTexture catches it
for textures whose names follow conventions, but verify manually.
- Reimporting against a different skeleton — animations bound to the old skeleton break;
keep one skeleton per character rig.
- CombineStaticMeshesBehavior set to combine for files with separate per-material meshes →
single SM with multiple material slots instead of independent assets.
- Missing lightmap UVs with baked lighting → splotchy shadows; enable
bGenerateLightmapUVs or author a dedicated UV channel.
- Interchange handles FBX by default in 5.8 — if a project depends on legacy FBX importer
behavior, disable
Interchange.FeatureFlags.Import.FBX intentionally.
- Runtime import without cooking the Interchange folder → pipelines missing at runtime;
add
/Engine/Plugins/Interchange/Runtime/Content to packaging cook paths.
- Large batches saturate the task graph — use
ImportAssetAsync and throttle concurrent
calls; UInterchangeManager::IsImporting() checks whether an import is in flight.
Version notes
- Interchange is the default importer for glTF/GLB and most textures since UE 5.0; it has
expanded each release. In 5.8 FBX imports through Interchange by default; the legacy
importer remains available by disabling
Interchange.FeatureFlags.Import.FBX.
UInterchangeAssetImportData replaces per-format import data classes for Interchange-
handled assets; legacy paths still produce UFbxAssetImportData etc.
UInterchangeFbxTranslatorSettings::bUseUfbxParser (still experimental in 5.8) enables the
ufbx SDK instead of the Autodesk FBX SDK — useful for open-source builds.
References & source material
Engine source (UE 5.8):
Core Interchange (under Engine/Source/Runtime/Interchange/):
Engine/Public/InterchangeManager.h — UInterchangeManager singleton, ImportAsset:648,
ImportAssetAsync:682, ReimportAsset:711, CreateSourceData:804, CanReimport:634,
GetTranslatorForSourceData:835, FImportAssetParameters:407.
Core/Public/InterchangeTranslatorBase.h — UInterchangeTranslatorBase:63,
Translate():98, GetSupportedFormats():90, CanImportSourceData():70.
Core/Public/InterchangePipelineBase.h — UInterchangePipelineBase:219,
ExecutePipeline:603, ExecutePostFactoryPipeline:612, ExecutePostImportPipeline:620,
EInterchangePipelineContext:46, EInterchangePipelineTask:37.
Core/Public/InterchangeFactoryBase.h — UInterchangeFactoryBase:70,
BeginImportAsset_GameThread:150, ImportAsset_Async:178, EndImportAsset_GameThread:194,
SetupObject_GameThread:289, BuildObject_GameThread:302, FinalizeObject_GameThread:318.
Core/Public/InterchangeSourceData.h — UInterchangeSourceData:22, GetFilename(),
SetFilename(), GetFileContentHash().
Engine/Public/InterchangeAssetImportData.h — UInterchangeAssetImportData:20,
GetFromObject():118, GetNodeContainer():142, GetPipelines():151,
GetTranslatorSettings():167.
Engine/Public/InterchangeProjectSettings.h — FInterchangePipelineStack:31.
Interchange plugin (under Engine/Plugins/Interchange/Runtime/Source/):
Import/Public/Fbx/InterchangeFbxTranslator.h — UInterchangeFbxTranslator:81,
UInterchangeFbxTranslatorSettings:34 (bConvertScene, bConvertSceneUnit,
bForceFrontXAxis, EInterchangeCoordinateSystemPolicy).
Import/Public/Gltf/InterchangeGltfTranslator.h — UInterchangeGLTFTranslator:26.
Pipelines/Public/InterchangeGenericMeshPipeline.h — UInterchangeGenericMeshPipeline:53
(bImportStaticMeshes, CombineStaticMeshesBehavior, bBuildNanite, bGenerateLightmapUVs,
bCollision, bImportSkeletalMeshes, SkeletalMeshImportContentType).
Pipelines/Public/InterchangeGenericTexturePipeline.h — UInterchangeGenericTexturePipeline:19
(bImportTextures, bDetectNormalMapTexture, bFlipNormalMapGreenChannel, bImportUDIMs).
Pipelines/Public/InterchangeGenericAnimationPipeline.h — animation settings.
FactoryNodes/Public/InterchangeStaticMeshFactoryNode.h — UInterchangeStaticMeshFactoryNode.
FactoryNodes/Public/InterchangeSkeletalMeshFactoryNode.h — UInterchangeSkeletalMeshFactoryNode.
FactoryNodes/Public/InterchangeTextureFactoryNode.h — UInterchangeTextureFactoryNode.
Legacy FBX (under Engine/Source/Editor/UnrealEd/Classes/Factories/):
Factory.h — UFactory:46 (base class for all legacy import factories).
FbxImportUI.h — UFbxImportUI, EFBXImportType.
FbxStaticMeshImportData.h, FbxSkeletalMeshImportData.h, FbxTextureImportData.h
— per-type legacy settings structs.
Runtime Engine:
Engine/Classes/EditorFramework/AssetImportData.h — UAssetImportData:71,
FAssetImportInfo::FSourceFile (path, timestamp, MD5 hash).
Official docs (UE 5.8, all fetched and verified):
Deep-dive references in this skill:
- references/interchange-framework.md — Interchange
class map, module locations, node types, dispatcher, and factory protocol.
- references/mesh-and-texture-import.md — full
mesh and texture pipeline settings with source-verified property names.
- references/reimport-and-import-data.md — reimport
workflow,
UInterchangeAssetImportData API, and legacy FBX import data migration.
Related skills: ue-meshes-static-and-skeletal, ue-materials-and-shaders, ue-asset-management,
ue-audio-and-metasounds, ue-editor-scripting-and-python.
1---2name: ue-importing-content3description: Import external assets into Unreal using the Interchange framework (UInterchangeManager, UInterchangePipelineBase, UInterchangeFactoryBase, UInterchangeTranslatorBase, UInterchangeSourceData) and the legacy FBX pipeline (UFbxFactory / UnFbx::FFbxImporter). Covers the three-stage Interchange pipeline (translate → pipeline → factory), pipeline stacks, format support (FBX, glTF/GLB, OBJ, USD, images, audio), mesh and texture import settings (units/axes, normals, lightmap UVs, Nanite, sRGB/compression), skeletal mesh skeleton assignment, import asset data (UInterchangeAssetImportData / UAssetImportData), and programmatic runtime import via C++, Blueprint, and Python. Use when importing DCC content, troubleshooting wrong scale/rotation/shading after import, scripting automated batch import, customising an import pipeline, or setting up a repeatable reimport workflow.4---56# Importing content78Most "it looks wrong in Unreal" problems are import-settings problems. Know the Interchange9framework's data flow, the settings that change geometry and shading, and how assets store10their import provenance so reimport stays predictable.1112## When to use this skill1314- Importing static meshes, skeletal meshes, textures, or audio from Blender, Maya, Substance15 Painter, or other DCC tools.16- Wrong scale, rotation, flipped normals, or washed-out/over-saturated textures after import.17- Setting up skeleton assignment and morph targets for character assets.18- Writing automated batch import via `UInterchangeManager` in C++, Blueprint, or Python.19- Customising an import pipeline (C++ subclass, Blueprint, or Python) to enforce project20 conventions.21- Debugging why reimport does not pick up the expected source file or settings.2223## Pipelines: Interchange vs legacy2425**Interchange** (default for FBX, glTF, GLB, OBJ, most images, audio)26is the modern framework. Every import passes through three stages:27281. **Translator** — reads the file into a format-neutral `UInterchangeBaseNodeContainer` (a29 graph of `UInterchangeBaseNode` objects representing meshes, bones, textures, etc.).302. **Pipeline stack** — a user-configured ordered list of `UInterchangePipelineBase` objects31 that transform translator nodes into *factory nodes* (what to create, with what settings).323. **Factory** — a `UInterchangeFactoryBase` subclass that creates the final `UObject` asset33 (e.g. `UInterchangeStaticMeshFactory`, `UInterchangeTextureFactory`).3435The **legacy FBX importer** (`UFbxFactory` / `UnFbx::FFbxImporter`) handles FBX only when36Interchange FBX is disabled. It has its own import dialog and options struct37(`UFbxImportUI`). Both paths record source file data in a `UAssetImportData`-derived object on38the asset.3940See [references/interchange-framework.md](references/interchange-framework.md) for a full41breakdown of all Interchange classes, module locations, and the factory six-step protocol.4243## Supported formats4445| Asset type | Interchange formats | Legacy/other |46|---|---|---|47| Static mesh | FBX, glTF, GLB, OBJ | FBX (legacy) |48| Skeletal mesh + animation | FBX, glTF, GLB | FBX (legacy) |49| Texture | PNG, TGA, JPEG, EXR, HDR, DDS, IES, PSD, BMP | — |50| Audio | WAV, AIF/AIFF, FLAC, OGG, OPUS, MP3 | — |51| Scene / level import | FBX, glTF, GLB, MaterialX | FBX scene legacy |5253FBX imports through Interchange by default in 5.8; revert to the legacy importer with the54console variable `Interchange.FeatureFlags.Import.FBX 0` (and `.ToLevel 0` for scene import).5556## Units, scale, and axes5758Unreal world units are **centimetres**. Meshes exported at the wrong scale require59actor-level rescaling and break physics.6061- FBX: `UInterchangeFbxTranslatorSettings::bConvertSceneUnit = true` (default) converts to62 cm automatically. Prefer exporting at 1 unit = 1 cm from the DCC.63- Axis: Unreal is **left-handed, Z-up**. `bConvertScene = true` (default) remaps Y/Z from64 right-handed sources. `EInterchangeCoordinateSystemPolicy` controls the exact strategy:65 `MatchUpForwardAxes` (default), `MatchUpAxis`, or `KeepXYZAxes`.66- Apply all transforms / freeze rotation in the DCC before export; baked-in offsets67 appear as permanent root-bone offsets on skeletal meshes.6869## Mesh import settings that matter7071These map to properties on `UInterchangeGenericMeshPipeline` (Interchange) or72`UFbxStaticMeshImportData` / `UFbxSkeletalMeshImportData` (legacy):7374| Setting | Effect | Common mistake |75|---|---|---|76| **Combine Static Meshes** (`CombineStaticMeshesBehavior`) | Merges all meshes in the file into one SM (`All`/`VisibleOnly`/`DoNotCombine`) | Leave on `DoNotCombine` when file has multiple independent assets |77| **Normals / Tangents** (`Build` > Recompute Normals/Tangents) | Trust DCC normals vs let UE recompute | Mismatch causes shading seams at UV splits |78| **Generate Lightmap UVs** (`bGenerateLightmapUVs`) | Auto-generates a second UV channel for Lightmass | Needed for baked lighting; off for pure Lumen |79| **Build Nanite** (`bBuildNanite`) | Enables Nanite on static meshes | On by default in 5.8 Interchange; disable for low-poly props |80| **LOD Group** | Assigns Epic's LOD reduction presets | Pick `SmallProp`, `LargeDetail`, etc. to match use case |81| **Collision** (`bCollision`) | Imports/generates simple collision | Prefix meshes with `UCX_`, `UBX_`, `USP_`, `UCP_` for custom shapes |8283Skeletal mesh–specific:8485- **Skeleton** (`CommonSkeletalMeshesAndAnimationsProperties`) — reuse one skeleton asset86 across compatible meshes so all animations are shareable.87- **Import Content Type** — `GeometryAndSkinningWeights`, `GeometryOnly`, or88 `SkinningWeightsOnly`. Split imports can be parallelised for large character updates.89- **Import Morph Targets** — imports blend shapes from FBX/glTF morph target data.90- **Create Physics Asset** — auto-generates a `UPhysicsAsset` if none exists.9192See [references/mesh-and-texture-import.md](references/mesh-and-texture-import.md) for the93full mesh and texture settings reference with source-verified property names.9495## Texture import settings that matter9697| Setting | Correct value | Consequence of wrong value |98|---|---|---|99| **sRGB** | ON for color/albedo; OFF for data maps | Data maps (normal, roughness, metallic, masks) with sRGB ON look wrong in lighting |100| **Compression** | `Default` (BC1/BC3) for color; `Normalmap` (BC5) for normals; `Masks`; `HDR` for EXR/HDR | Wrong compression costs memory or quality |101| **Flip Normal Map Green Channel** | Match DCC convention (on for Maya/DirectX, off for Blender/OpenGL-style) | Specular highlight in wrong direction |102| **Detect Normal Map Texture** | ON (default) | Leave on; it sets sRGB=false and compression=Normalmap automatically |103| **UDIM** (`bImportUDIMs`) | ON for assets with UDIM naming (`_1001`, `_1002`, …) | Multi-tile textures import as separate unrelated assets |104105Texture compression and LOD group are stored on the `UTexture2D` asset; change them in the106Texture Editor or set them in a custom pipeline's `ExecutePostFactoryPipeline`.107108## Import asset data and reimport109110Every imported asset stores provenance in a `UAssetImportData`-derived subobject:111112- **Interchange path**: `UInterchangeAssetImportData` (subclass of `UAssetImportData`)113 stores the source file path, the translator settings, the pipeline list, and the node114 container snapshot. Accessible with `UInterchangeAssetImportData::GetFromObject(Asset)`.115- **Legacy FBX path**: `UFbxAssetImportData` / `UFbxStaticMeshImportData` (subclasses of116 `UAssetImportData`).117- The base class `UAssetImportData` stores source file path, timestamp, and MD5 hash in118 `FAssetImportInfo::FSourceFile` entries — enabling reimport to detect stale files.119120Reimport replays the same pipeline stack and settings stored in the import data. Call121`UInterchangeManager::ReimportAsset` / `ReimportAssetAsync` programmatically; the manager122reads `UInterchangeAssetImportData` to resolve the original source file.123124See [references/reimport-and-import-data.md](references/reimport-and-import-data.md) for the125full reimport workflow, programmatic API examples, and how to migrate legacy FBX import data.126127## Programmatic import via C++128129```cpp130// Create a source data handle pointing to a file on disk.131UInterchangeSourceData* Src =132 UInterchangeManager::CreateSourceData(TEXT("D:/Art/Rock.glb"));133134// Build import parameters.135FImportAssetParameters Params;136Params.bIsAutomated = true; // suppress dialogs137138// Synchronous import (editor-only; blocking on game thread).139UInterchangeManager& Mgr = UInterchangeManager::GetInterchangeManager();140TArray<UObject*> Imported;141Mgr.ImportAsset(TEXT("/Game/Meshes"), Src, Params, Imported);142143// Async import with a completion callback.144UE::Interchange::FAssetImportResultRef Result =145 Mgr.ImportAssetAsync(TEXT("/Game/Meshes"), Src, Params);146Result->OnDone([](UE::Interchange::FImportResult& R)147{148 for (UObject* Obj : R.GetImportedObjects())149 {150 UE_LOG(LogTemp, Log, TEXT("Imported: %s"), *Obj->GetName());151 }152});153```154155Key API points:156- `UInterchangeManager` is a singleton; use `GetInterchangeManager()` (native) or157 `GetInterchangeManagerScripted()` (Blueprint/Python callable).158- `FImportAssetParameters::OverridePipelines` accepts a list of `FSoftObjectPath`s to bypass159 the project-default pipeline stack with a custom one.160- `FImportAssetParameters::bIsAutomated = true` prevents any modal dialog from opening —161 essential for unattended batch import.162- For runtime import in a cooked build, the `Interchange` content folder must be added to163 **Project Settings > Packaging > Additional Asset Directories to Cook**.164165## Writing a custom pipeline in C++166167Subclass `UInterchangePipelineBase` and override the virtual pipeline hooks:168169```cpp170// MyImportPipeline.h171#pragma once172#include "InterchangePipelineBase.h"173#include "MyImportPipeline.generated.h"174175UCLASS(BlueprintType, editinlinenew)176class MYMODULE_API UMyImportPipeline : public UInterchangePipelineBase177{178 GENERATED_BODY()179180 /** Shown in the Interchange dialog; locked during reimport. */181 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "My Settings",182 meta = (ReimportRestrict = "true"))183 bool bEnforceNamingConvention = true;184185protected:186 virtual void ExecutePipeline(187 UInterchangeBaseNodeContainer* NodeContainer,188 const TArray<UInterchangeSourceData*>& SourceDatas,189 const FString& ContentBasePath) override;190191 virtual void ExecutePostFactoryPipeline(192 const UInterchangeBaseNodeContainer* NodeContainer,193 const FString& FactoryNodeKey,194 UObject* CreatedAsset,195 bool bIsAReimport) override;196};197```198199- `ExecutePipeline` fires after translation; add/modify factory nodes to control what assets200 get created and with what settings.201- `ExecutePostFactoryPipeline` fires after the factory creates the asset but before202 `PostEditChange`; modify the live `UObject` here.203- `ExecutePostImportPipeline` fires after `PostEditChange` and async build; use for204 post-build fixups (e.g. setting socket transforms that depend on render data).205- Mark properties `ReimportRestrict = "true"` to prevent them being changed during reimport.206207Register the pipeline asset in your project's pipeline stack via **Project Settings >208Engine > Interchange** or pass it via `FImportAssetParameters::OverridePipelines`.209210## Naming conventions211212`SM_` static mesh · `SK_` skeletal mesh · `SKEL_` skeleton · `T_` texture · `M_` material ·213`MI_` material instance · `A_` / `S_` sound · `BP_` Blueprint · `DA_` data asset ·214`DT_` data table. Consistent prefixes make content browsable and scriptable.215216## Gotchas217218- **Wrong scale** — almost always DCC export units or `bConvertSceneUnit` mismatch; fix at219 source, not by scaling actors. A 100× scale error is common when Blender units = meters.220- **sRGB on for normal/data maps** → wrong lighting; `bDetectNormalMapTexture` catches it221 for textures whose names follow conventions, but verify manually.222- **Reimporting against a different skeleton** — animations bound to the old skeleton break;223 keep one skeleton per character rig.224- **CombineStaticMeshesBehavior** set to combine for files with separate per-material meshes →225 single SM with multiple material slots instead of independent assets.226- **Missing lightmap UVs with baked lighting** → splotchy shadows; enable227 `bGenerateLightmapUVs` or author a dedicated UV channel.228- **Interchange handles FBX by default in 5.8** — if a project depends on legacy FBX importer229 behavior, disable `Interchange.FeatureFlags.Import.FBX` intentionally.230- **Runtime import without cooking the Interchange folder** → pipelines missing at runtime;231 add `/Engine/Plugins/Interchange/Runtime/Content` to packaging cook paths.232- **Large batches saturate the task graph** — use `ImportAssetAsync` and throttle concurrent233 calls; `UInterchangeManager::IsImporting()` checks whether an import is in flight.234235## Version notes236237- Interchange is the default importer for glTF/GLB and most textures since UE 5.0; it has238 expanded each release. In 5.8 FBX imports through Interchange by default; the legacy239 importer remains available by disabling `Interchange.FeatureFlags.Import.FBX`.240- `UInterchangeAssetImportData` replaces per-format import data classes for Interchange-241 handled assets; legacy paths still produce `UFbxAssetImportData` etc.242- `UInterchangeFbxTranslatorSettings::bUseUfbxParser` (still experimental in 5.8) enables the243 ufbx SDK instead of the Autodesk FBX SDK — useful for open-source builds.244245## References & source material246247Engine source (UE 5.8):248249Core Interchange (under `Engine/Source/Runtime/Interchange/`):250- `Engine/Public/InterchangeManager.h` — `UInterchangeManager` singleton, `ImportAsset`:648,251 `ImportAssetAsync`:682, `ReimportAsset`:711, `CreateSourceData`:804, `CanReimport`:634,252 `GetTranslatorForSourceData`:835, `FImportAssetParameters`:407.253- `Core/Public/InterchangeTranslatorBase.h` — `UInterchangeTranslatorBase`:63,254 `Translate()`:98, `GetSupportedFormats()`:90, `CanImportSourceData()`:70.255- `Core/Public/InterchangePipelineBase.h` — `UInterchangePipelineBase`:219,256 `ExecutePipeline`:603, `ExecutePostFactoryPipeline`:612, `ExecutePostImportPipeline`:620,257 `EInterchangePipelineContext`:46, `EInterchangePipelineTask`:37.258- `Core/Public/InterchangeFactoryBase.h` — `UInterchangeFactoryBase`:70,259 `BeginImportAsset_GameThread`:150, `ImportAsset_Async`:178, `EndImportAsset_GameThread`:194,260 `SetupObject_GameThread`:289, `BuildObject_GameThread`:302, `FinalizeObject_GameThread`:318.261- `Core/Public/InterchangeSourceData.h` — `UInterchangeSourceData`:22, `GetFilename()`,262 `SetFilename()`, `GetFileContentHash()`.263- `Engine/Public/InterchangeAssetImportData.h` — `UInterchangeAssetImportData`:20,264 `GetFromObject()`:118, `GetNodeContainer()`:142, `GetPipelines()`:151,265 `GetTranslatorSettings()`:167.266- `Engine/Public/InterchangeProjectSettings.h` — `FInterchangePipelineStack`:31.267268Interchange plugin (under `Engine/Plugins/Interchange/Runtime/Source/`):269- `Import/Public/Fbx/InterchangeFbxTranslator.h` — `UInterchangeFbxTranslator`:81,270 `UInterchangeFbxTranslatorSettings`:34 (`bConvertScene`, `bConvertSceneUnit`,271 `bForceFrontXAxis`, `EInterchangeCoordinateSystemPolicy`).272- `Import/Public/Gltf/InterchangeGltfTranslator.h` — `UInterchangeGLTFTranslator`:26.273- `Pipelines/Public/InterchangeGenericMeshPipeline.h` — `UInterchangeGenericMeshPipeline`:53274 (`bImportStaticMeshes`, `CombineStaticMeshesBehavior`, `bBuildNanite`, `bGenerateLightmapUVs`,275 `bCollision`, `bImportSkeletalMeshes`, `SkeletalMeshImportContentType`).276- `Pipelines/Public/InterchangeGenericTexturePipeline.h` — `UInterchangeGenericTexturePipeline`:19277 (`bImportTextures`, `bDetectNormalMapTexture`, `bFlipNormalMapGreenChannel`, `bImportUDIMs`).278- `Pipelines/Public/InterchangeGenericAnimationPipeline.h` — animation settings.279- `FactoryNodes/Public/InterchangeStaticMeshFactoryNode.h` — `UInterchangeStaticMeshFactoryNode`.280- `FactoryNodes/Public/InterchangeSkeletalMeshFactoryNode.h` — `UInterchangeSkeletalMeshFactoryNode`.281- `FactoryNodes/Public/InterchangeTextureFactoryNode.h` — `UInterchangeTextureFactoryNode`.282283Legacy FBX (under `Engine/Source/Editor/UnrealEd/Classes/Factories/`):284- `Factory.h` — `UFactory`:46 (base class for all legacy import factories).285- `FbxImportUI.h` — `UFbxImportUI`, `EFBXImportType`.286- `FbxStaticMeshImportData.h`, `FbxSkeletalMeshImportData.h`, `FbxTextureImportData.h`287 — per-type legacy settings structs.288289Runtime Engine:290- `Engine/Classes/EditorFramework/AssetImportData.h` — `UAssetImportData`:71,291 `FAssetImportInfo::FSourceFile` (path, timestamp, MD5 hash).292293Official docs (UE 5.8, all fetched and verified):294- Interchange Framework —295 <https://dev.epicgames.com/documentation/unreal-engine/interchange-framework-in-unreal-engine>296- Importing Assets Using Interchange —297 <https://dev.epicgames.com/documentation/unreal-engine/importing-assets-using-interchange-in-unreal-engine>298- Interchange Import Reference —299 <https://dev.epicgames.com/documentation/unreal-engine/interchange-import-reference-in-unreal-engine>300- Interchange Development Guides —301 <https://dev.epicgames.com/documentation/unreal-engine/interchange-development-guides>302- FBX Content Pipeline —303 <https://dev.epicgames.com/documentation/unreal-engine/fbx-content-pipeline>304- Working with Content —305 <https://dev.epicgames.com/documentation/unreal-engine/working-with-content-in-unreal-engine>306307Deep-dive references in this skill:308- [references/interchange-framework.md](references/interchange-framework.md) — Interchange309 class map, module locations, node types, dispatcher, and factory protocol.310- [references/mesh-and-texture-import.md](references/mesh-and-texture-import.md) — full311 mesh and texture pipeline settings with source-verified property names.312- [references/reimport-and-import-data.md](references/reimport-and-import-data.md) — reimport313 workflow, `UInterchangeAssetImportData` API, and legacy FBX import data migration.314315Related skills: `ue-meshes-static-and-skeletal`, `ue-materials-and-shaders`, `ue-asset-management`,316`ue-audio-and-metasounds`, `ue-editor-scripting-and-python`.