接手过不少从 3ds Max、Maya、Blender 往 UE 过资产的活,发现一个规律:大部分 FBX 导入 UE 的问题,根本不发生在 UE 这边,而是从导出那一刻就决定了。 同一个 FBX,在 Max 里看正常,进 UE 后模型歪了、贴图丢了、材质发黑、光照 UV 报错,这些几乎每个 UE 开发者都遇到过。这篇文章把我这些年处理 FBX 导入 UE 的经验、踩过的坑、以及最终沉淀下来的工作流都写出来,希望能帮你少走弯路。
文章会从 3D 软件导出前要做什么准备讲起,再到 UE 导入面板每个选项的含义和取舍,然后是贴图材质丢失的完整排查链路,最后聊到批量导入和工程规范化。不管你是刚入行的美术、坐班 TA,还是需要自己啃资产的独立开发,都值得看下去。
1. 导入 UE 之前,先在 3D 软件里解决这些“隐形坑”
很多人拿到一个 FBX 就直接拖进 UE,结果模型缩放完全不对、朝向横着躺,第一反应是“UE 导入坏了”,其实问题大多出在导出端。这一章先讲清楚哪些事情必须在 DCC 软件里做完,再去导 FBX,否则到了 UE 里查来查去都是在折腾表象。
1.1 单位制与轴向:模型“躺着”“巨大无比”的根源
UE 的基准单位是厘米,3ds Max 中虽然默认工作单位是系统单位,但实际建模时很多人用的建模单位并不统一。最大坑在于“系统单位”和“显示单位”不一致。比如你在 Max 里用 1m 代表一个单位,但没把系统单位设置成厘米,导出 FBX 时规模可能直接放大或缩小 100 倍。最常见的情况是:从其他软件或素材站下载的模型,导入 UE 后大得离谱或者小成蚂蚁。
在 Max 里导出前,我建议先确认一下:
- 系统单位设置为厘米:
Customize -> Units Setup -> System Unit Setup -> 1 Unit = 1.0 Centimeters - 显示单位也切到公制厘米,确保你看到的数值就是真实厘米。
Maya 用户要特别注意轴向。UE 是 Z 轴向上、左手坐标系,而 Maya 默认是 Y 轴向上。从 Maya 导出 FBX 时,如果不在导出设置里处理轴向,导入 UE 后模型就会“躺倒”。解决方向有两个:要么在 Maya 烘焙插件里把轴改为 Z 轴向上,要么在 UE 的 FBX 导入面板中设置“导入平移”为“将 Y 轴向上转换为 Z 轴向上”。对于 3ds Max,默认 Z 轴向上,所以轴向问题相对少,但也不是没有——如果模型在 Max 里被旋转过带有一个奇怪的角度,导出时没有重置变换,导入 UE 后也会有微小的偏转。
个人经验:在 DCC 里导出前,把模型的所有变换“清零”是最保险的。 选中模型后 Reset XForm,然后 Collapse to 可编辑多边形,再统一把模型放到世界原点,特别是枢轴也归零。这样导出的 FBX 到 UE 后,不会出现位置漂移和旋转错乱。
1.2 命名、层级与枢轴:别让 UE 资产浏览器出现一堆“None”
FBX 导入 UE 后,资产名字直接用 FBX 里的网格节点名。如果命名包含中文、空格、特殊字符(比如括号、句号),创建出来的 UE 资产名可能带后缀、或者被替换成“None”,又或者出现同名冲突导致模型被意外覆盖。我见过团队项目里出现过 mesh(1)、cube_copy_final_v2 这种名字,导入 UE 后混乱得完全没法用。
建议统一规范:只允许字母、数字、下划线,首字符不能是数字。层级方面,如果 FBX 根节点下有多个网格,UE 导入面板默认会“合并网格”或保留为多个组件,这取决于你勾了什么。如果你只是导入一个静态物体,层级无所谓;但如果是需要拆分部位做交互的模型(比如门、柜子抽屉),最好保留独立网格节点,并在 UE 里使用“网格体合并”时自己控制。
枢轴(Pivot)也值得单独说。FBX 导入到 UE 时,模型的位置由每个网格的 Local Transform 决定。如果在建模软件中物体原点不在世界原点,导入 UE 后模型也会带着那个偏移。很多从 SketchUp 或 Blender 导出的模型都是“整体在世界原点,但内部每个物件飘在各处”,导入后资产本身没问题,但放置到关卡后要手动对齐。所以我通常在导出前把模型的枢轴居中到几何中心,或者统一到世界原点,具体看资产用途。
1.3 需要批量导出时:用 MaxScript 比手动一个个导省心得多
“3dmax 批量导出 fbx”是很多美术在接到大量资产任务时的刚需。一个场景几十个木箱、路障、道具,如果每个都手动导出 FBX,重复劳动不说,很容易漏掉某些选项导致一批资产风格不统一。我的做法是用一个简单的 MaxScript 完成批量导出。
思路很简单:选中场景中需要导出的多个物体,脚本会逐个把单个物体导出为独立 FBX,文件名直接与物体名一致。核心代码如下:
maxscript复制-- 批量导出选中物体为独立FBX
myObjects = selection as array
if myObjects.count == 0 do (
messageBox "请先选中需要导出的物体"
return()
)
exportDir = getSavePath caption:"选择导出目录"
if exportDir != undefined do (
for obj in myObjects do (
select obj
fname = exportDir + "\\" + obj.name + ".fbx"
-- FBX导出器参数:单位厘米,Z轴向上,不嵌入媒体
exportFile fname #noPrompt selectedOnly:true \
using:FBXExporter \
axisType:#eAxis_Default \
scaleType:#eScale_Centimeters \
useStudioScale:true \
embedTextures:false
)
-- 恢复原始选择
select myObjects
messageBox "批量导出完成"
)
注意这里我特意设置了 embedTextures:false。为什么?因为嵌入媒体虽然会让 FBX 变大一点,理论上 UE 能读出贴图数据,但实际中 UE 的 FBX 解析对嵌入贴图的支持并不稳定,尤其当贴图格式是 PSD 或带图层的 TIFF 时,经常会出现“能看到材质名但找不到贴图”的诡异现象。所以我的流程里,贴图永远是单独从 Max 导出,不依赖 FBX 内嵌。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. FBX 导入面板的选项拆解:每个开关动了会怎样
当你在 UE 里双击一个 FBX 文件或拖拽进视口时,弹出的 Import Options 面板里选项非常多。很多教程只告诉你“勾选这个”“取消那个”,却不讲背后的逻辑。这一章把我认为最关键、最容易出问题的几个部分逐一说明。
2.1 导入类型:Mesh、Skeletal Mesh、Animation 别混着用
导入面板顶部有一个“Mesh”或“Skeleton”的选择。如果你要导入的是静态模型,保持默认“Mesh”;如果是带骨骼动画的角色,必须选“Skeletal Mesh”;如果只是想导入动画数据到已有骨骼,则只勾选“Animation”。一个常见操作失误是:把带骨骼的角色动画 FBX 当普通网格导入,结果 UE 导入了一个奇怪的静态网格体。这不是 UE 的问题,而是导入类型设置错了。
静态网格和骨骼网格在导入后生成的资产类型不同,后续能做的操作也完全不同。如果你拿到的是包含网格、骨骼、动画三合一的 FBX,推荐拆成两到三个文件分别导入:一个角色模型网格、一个动画文件。这样后期可以通过 AnimSequence 独立管理每个动画资源,而不是一个动画包含几十条片段。
2.2 网格选项:合并、碰撞与光照 UV
静态网格 FBX 的“Mesh”栏里,有几个默认勾选的选项值得注意:
- 合并网格:如果 FBX 包含多个独立网格节点,打开后会在导入时合并成一个静态网格体。对于只有单物体的道具来说无感,但场景类的独立部件如果勾了合并,分割交互会变得很麻烦。我一般默认关闭,必要时手动在 UE 里
Merge Actor。 - 生成缺失碰撞:UE 的碰撞检测依赖于简单盒体/球体/凸包,如果 FBX 里没有自定义碰撞体,UE 会在导入时自动生成。默认生成的是“项目设定的碰撞复杂度”,通常是凸包,精度有限。对需要精准碰撞的物体(如台阶、地面上的碎块),不建议依赖这个生成,而是在 DCC 中准备好碰撞代理体,或者导入后在 UE 静态网格编辑器里手动添加凸包分解。
- 生成光照贴图 UV:这是最容易忽略的一个坑。UE 静态光照烘焙需要 Lightmap UV,你可以简单理解成“第二套 UV”。如果模型只有一套 UV,烘焙时会报错“Lightmap UVs missing”,除非你在 DCC 里手动制作了一套用于光照图的 UV,否则导入时必须勾选“生成光照贴图 UV”。
2.3 变换设置:适应不同 DCC 的轴向
FBX 导入面板的“Transform”部分,一般有“导入平移”和“法线导入方法”。
导入平移有三个选项:
- 自动:让 UE 根据源软件信息自动判断轴向;
- 将 Y 轴向上转换为 Z 轴向上:主要针对 Maya 导出的模型;
- 默认:直接按 FBX 数据导入,不进行额外的旋转。
从 Maya 来的资产通常选第二项。从 Max 和 Blender 导出时,使用“自动”或“默认”一般没问题。如果你发现导入后模型朝前方向不对,可以在这里临时切换“导入平移”,同时对比一下视口里的预览结果。
法线导入方法也经常引发困惑。Maya、Blender、Max 的法线规则各有不同,UE 默认“从 FBX 文件导入法线”,但有些软件导出的法线方向朝内,导致模型表面看起来黑乎乎的。此时可以试试在导入面板把法线调成“反转法线:导入操作时反转法线”,或者回到 DCC 翻转法线重导。
2.4 材质导入:不要无脑生成材质
FBX 导入面板里有“Material Import Method”,可选项包括:
- 不创建材质:只导入网格数据,材质留空,后续在 UE 里手动指定。
- 创建材质:按照 FBX 里的材质名和纹理引用路径生成材质资产。实际上,FBX 里存储的贴图引用是 DCC 软件中的本地绝对路径,UE 并不认识,因此生成出来的材质多半是空的,或者只有名字但纹理节点是坏的。
- 创建新材质:不管 FBX 里已有的材质,总是创建新资产,即使命名相同。
对于从外部拿到 FBX 的工作流,我强烈建议选择“不创建材质”或“创建新材质”,然后在 UE 里用标准 PBR 流程自己连材质。优点是可控性强,不会出现一堆无名材质。如果你做的是程序化生成资源,后续也可以通过脚本根据命名规则自动指定贴图,这在第五章会展开。
3. 贴图材质丢失的完整排查链路:从“紫黑材质”到显示贴图
FBX 导入 UE 后,模型表面出现大片紫黑色、纯黑色、或者灰白色,这是新手最常见的问题。这章我们完整走一遍排查链路,从“为什么 Max 里看着好好的,进 UE 就黑了”开始。
3.1 先搞清楚 FBX 里的贴图引用是怎么工作的
FBX 格式本质上是一个几何数据容器,对于材质和纹理,它只会保留两种东西:材质节点的名称,以及纹理取样器指向的文件路径。这条路径是创建 FBX 的软件里使用的绝对路径,例如 C:\Users\xxx\Documents\3dsmax\maps\floor_diffuse.jpg。UE 在导入 FBX 时不会去读取这条绝对路径,因为它不安全、也不跨平台。所以导入 UE 后的材质网络里,纹理节点是空的,材质样本看起来就是默认的灰色或紫色。
有些建模软件在导出 FBX 时允许勾选“嵌入媒体”,也就是把纹理数据全部打包进 FBX。UE 可以识别一部分嵌入纹理,但兼容性有限,而且 FBX 文件会变得巨大。我的建议是:把贴图当作独立资产处理,不要依赖 FBX 帮你带贴图。
3.2 从“黑模”逆推根因的排查步骤
如果你的模型导入后是纯黑的,按照下面这个顺序排查:
- 查看场景中的光照。UE 默认的纯黑显示往往是因为没有放置光源或光照模式不对,并非材质问题。
- 查看静态网格体编辑器里的材质球。如果材质球是空的(没有任何节点),说明导入时没有正确生成材质,重新按“创建新材质”导入。
- 查看贴图是否导入成功。内容浏览器中如果没有对应的 .TGA/.PNG 文件,说明你还要单独导入贴图。
- 在材质编辑器里按
Ctrl+Alt+点击 3D 预览或者编译材质看错误列表。材质节点报错也会让最终显示为黑色。
如果模型是紫黑相间的“斑马色”,多半是材质引用了缺失的纹理。比如材质节点连接了 BaseColor 贴图,但该贴图资产被删除或没有指定,UE 会以洋红色棋盘格提醒你资源缺失。
3.3 让 UE 显示贴图的三种实操方案
方案一:手动指定材质。在内容浏览器中导入贴图,创建材质,把贴图连到 BaseColor 等节点,拖到模型上。这是最保底的方法。
方案二:利用命名规范自动选择纹理。很多团队会约定贴图后缀,比如 _D(漫反射)、_N(法线)、_R(粗糙度)、_M(金属度)。在 UE 中使用 Asset Action Utility 或 Python 脚本,可以按名字自动创建材质并连接对应贴图。下面是一个简化版 Editor Utility Widget 的 Python 示例:
python复制import unreal
def create_material_from_textures(base_name):
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
mat_factory = unreal.MaterialFactoryNew()
package_path = "/Game/Materials"
mat = asset_tools.create_asset(base_name + "_Mat", package_path, None, mat_factory)
# 在这里加载贴图并设置参数
tex_d = unreal.EditorAssetLibrary.load_asset(package_path + "/" + base_name + "_D")
if tex_d:
# 将 tex_d 连接至 mat 的 BaseColor 节点
# 注意:完整实现需要在材质表达式层操作
pass
return mat
完整写法比较长,思路就是“根据材质名找到对应贴图,创建材质并建立连线”。这种方法非常适合批量导入几十个模型时使用。
方案三:用第三方工具或 Datasmith 导入。Datasmith 对 CAD、Revit、SketchUp 等场景文件的材质还原度更高,可以保留更多原始参数。但 Datasmith 默认面向完整场景导入,对于单个 FBX 资产,它并不总是比原生 FBX 导入更好用。我通常只在处理复杂场景或需要保留物体层级/元数据时才用 Datasmith。
3.4 贴图方向不对、法线贴图呈紫色,也属于“显示贴图”问题
还有一种“贴图显示了但看起来不对”的情况:法线贴图是紫色/蓝色的,但物体表面依然是平的或凹凸不明显。这通常意味着法线贴图没有真正生效,或者 UV 方向有误。检查材质里法线贴图是否连到了 Normal 输入,且纹理采样器的压缩设置是否为“法线贴图”(Normalmap),如果不改压缩方式,法线贴图会偏色且无法在材质中正确参与光照。
另一个常见问题是漫反射贴图“糊了”,检查导入贴图时是否勾选了“sRGB”。颜色贴图必须开启 sRGB,而法线贴图、粗糙度贴图、金属度贴图必须关闭 sRGB。这个如果搞反了,整个材质会显得发灰或过曝。
4. 导入后没完:碰撞、光照 UV、动画与枢轴返工点
FBX 成功进入 UE,看起来正常了,不代表事情结束了。实际项目中,后面的返工才是真正消耗时间的地方。这里说几个我经常在项目里踩到的返工点。
4.1 碰撞体缺失或错误:物体直接“穿过去”
静态网格体导入后,默认碰撞取决于导入面板里的“生成缺失碰撞”开关。如果你的模型是要用来做关卡拼图的,这个默认碰撞很多时候不够用。最典型的问题:楼梯用网格自带的凸包碰撞,角色走上去会卡住;门板用盒体碰撞,碰撞范围比模型大一圈;复杂造型的装饰物用凸包碰撞,直接挡住角色走位。
我的经验是:
- 对于规则物体,在 DCC 里制作一个低模碰撞网格,命名成
UCX_前缀,如UCX_Door,导入后 UE 就会自动把它识别为简单碰撞体。 - 对于不规则且需要精确碰撞的物体,导入后在静态网格体编辑器的“碰撞”菜单里使用“凸包分解”工具修改碰撞。
- 如果只是临时用,可以设置静态网格体“碰撞复杂度”为“使用复杂碰撞作为简单碰撞”,但这会大幅增加性能开销,不适合大量摆放。
4.2 Lightmap UV 缺失导致烘焙后大面积黑斑
当你烘焙静态光照时,场景里很多模型上出现面积巨大的黑色斑块,最直接原因就是没有 Lightmap UV。FBX 导入面板是可以自动生成光照贴图 UV 的,但生成的 UV 布局可能不是最优的,尤其是多个部件的模型,自动展开的 UV 会重叠,光照烘焙后产生“漏光”或“黑缝”。
更好的选择是在 3ds Max 里用平面映射或 Unwrap UVW 工具制作干净的第二套 UV。如果你没有第二套 UV,在导入面板勾选“生成光照贴图 UV”是保底做法。注意生成的是第三套还是第二套 UV,要看实际模型原有的 UV 层,UE 中静态网格体编辑器的“UV Settings”面板可以看到 UV 通道数量。
4.3 动作和骨骼:动画片段变成了一个长循环
带骨骼动画的 FBX 导入后,如果动画没有按片段拆分,UE 只会生成一个很长时间的 AnimSequence。这在你只想导入一小段攻击动作时会很讨厌。处理方式:
- 在 DCC 导出时,每个动画单独导出为一个 FBX,统一以动作命名,比如
Attack_A.fbx、Run.fbx; - 或者导入面板中勾选导入动画后,在 UE 的动画资产里用“切片”功能裁剪时间范围。
同时,根骨骼名字尽量保留一致,比如 root、pelvis,不同角色骨骼命名不一致时,动画重定向很麻烦。
4.4 枢轴不统一导致的放置混乱
本章最后提一下枢轴。导入后的模型放置在关卡里,如果你旋转它时发现旋转中心不在模型自身中心,基本就是 FBX 里枢轴没有居中。这个问题从建模软件里就应该解决:在 Max 中点击 Hierarchy -> Affect Pivot Only -> Center to Object;在 Blender 中 Set Origin -> Origin to Geometry。否则进入 UE 后,你没法直接编辑枢轴,除非再导回 DCC 处理。
5. 批量导入与工程规范化:小团队也能掌握的高效工作流
前面说的是单文件该怎么处理,最后聊一下批量导入和整体管线。拿到的资产不是一两个,而是几十上百个 FBX,这时手工逐个导入会崩溃,必须有规范化的流程。
5.1 先定标准:目录结构、命名规则、贴图后缀
不管团队规模多大,项目开始前就要约定:
- FBX 放哪个目录、贴图放哪个目录;
- 命名:
SM_前缀表示静态网格,SK_表示骨骼网格,TX_或T_表示贴图; - 贴图后缀:
_D、_N、_R、_M; - 单位统一厘米;
- 是否生成 Lightmap UV;
- 是否生成碰撞。
定好这些标准后,后续批量导入、批量修复材质、批量检查碰撞都能靠脚本完成,不用每个资产单独人工看。这也是很多自动化插件能有效工作的前提——不管用 UE 自带的 Asset Tools,还是第三方插件,底层都依赖命名和路径的一致。
5.2 用 Editor Utility Widget 搭一个批量导入工具
热搜词里经常看到“ue slate widget”“ue 整合为蓝图”,其实就是想自己写编辑器工具。UE 里做这类工具最方便的是 Editor Utility Widget,可以拖按钮、输入框,并用蓝图节点控制资产导入。核心思路:
- 创建一个 Editor Utility Widget;
- 添加“Button”和“Directory Path”控件;
- 在蓝图里遍历目标文件夹中的所有 FBX;
- 调用
ImportLibrary或FbxFactory导入; - 导入后根据文件名自动创建材质、指定贴图。
用蓝图的优势是美术也能改界面和逻辑,不需要等程序写插件。如果你熟悉 C++ 或 Python,也可以直接用 Python 脚本实现同样功能。我倾向先用 EUW 原型验证,再到数据量大时用 C++ 写一个独立插件。
一个简单的导入关键代码示意(Python):
python复制import unreal
def import_all_fbx(folder_path, destination_path):
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
task = unreal.AssetImportTask()
task.filename = folder_path
task.destination_path = destination_path
task.automated = True
task.save = True
task.options = unreal.FbxImportUI()
# 这里可以设置前面提到的导入选项
task.options.mesh_type_to_import = unreal.FBXImportType.FBXIT_STATIC_MESH
task.options.import_materials = False
task.options.import_textures = False
task.options.generate_lightmap_u_vs = True
asset_tools.import_asset_tasks([task])
注意:代码里的 FbxImportUI 的属性名在不同 UE 版本中可能略有差异,实际操作时以你用的版本为准。关键是理解为什么这样配置:关闭材质和纹理导入,是因为我们会在导入后按命名规范统一处理。
5.3 热搜词里那些“UE 快速找到选中的模型”其实也属于效率问题
在批量导入和复杂关卡中,经常需要在 3D 视口里选一个模型,然后立刻在内容浏览器里定位对应的资产。UE 有自带快捷键:选中 Actor 后按 Ctrl+B,或者在关卡视口右键选择“Browse to Asset”。这个操作不是 FBX 导入的直接内容,但它是 FBX 导入后资产检查中最高频的动作之一。我见过太多人一个个去内容浏览器里翻文件夹找资产,其实按一下 Ctrl+B 就解决了。
另一个相关技巧是:导入 FBX 后,勾选“缩略图”离线渲染,这样内容浏览器的资产能直接显示模型缩略图,不用打开模型才知道是什么。对大量资产管理来说,这一步非常提升效率。
5.4 避坑:用 Datasmith 批量导入前的权衡
如果场景非常复杂,比如从 Revit 或 CAD 导出的超大模型,Datasmith 比普通 FBX 导入更适合保留层级、材质和元数据。但 Datasmith 生成的是 Datasmith Scene Actor,而不是分散的网格体资产,如果你后续要单独控制某个物件,需要先转换为普通 Actor。这个转换会丢失部分元数据,所以想清楚再选路径,别到最后再返工。
另外,Datasmith 还会自动创建很多层级 Actor,如果一个项目里混用 Datasmith 和原生 FBX 导入,场景组织会变得很乱。团队里最好统一约定:单个资产用原生 FBX 导入,完整场景用 Datasmith,不要两条路径混着用。
6. 我自己的导入前检查清单和收尾建议
说了这么多,最后分享一个我每次拿到 FBX 都会过的检查清单:
- 检查模型单位是否为厘米,系统单位和显示单位是否一致。
- 检查模型轴向是否正确,UE 导入面板设置是否为自动或 Z 轴向上。
- 检查模型命名是否符合规范,是否有空格和特殊字符。
- 检查枢轴是否居中、重置变换是否完成。
- 检查模型是否生成第二套 UV 或导入时勾选“生成光照贴图 UV”。
- 检查贴图路径是否独立导出,不依赖 FBX 嵌入媒体。
- 检查材质导入方式是否为“不创建材质”或“创建新材质”,并准备好后续贴图自动连接方案。
- 检查碰撞体是否在 DCC 里准备好了
UCX_前缀的代理网格。
这套检查项不是为了让你每个都严格执行,而是帮你建立一种意识:FBX 导入 UE 出了问题,先回导出端找原因,再在导入面板调设置,不要一头扎进 UE 材质编辑器里瞎试。
另外,我个人非常推荐在项目初期就把 FBX 导入选项保存到项目设置或个人偏好里。UE 的 FBX 导入面板右上角有“保存设置”按钮,把自己的常用配置固化下来,之后每次导入都会沿用,从源头减少人为失误。
如果团队里有多个人都要导 FBX,最好的办法是把这套检查清单和导入设置写成一份简单的项目文档,或者干脆做成 Editor Utility Widget 一键导入。这些都是我实际操作后发现回报率极高的投入:前期花半小时做规范,后期省下的是按天计算的返工时间。
