1. 项目概述:为什么你需要一个专用的Blender到Unity的FBX导出器?
如果你在Blender里精心雕琢了一个角色、一辆车或者一个复杂的场景,满心欢喜地把它导出为FBX,拖进Unity,结果发现模型要么躺在地上,要么头朝下,甚至整个坐标轴都错乱了,那你绝对不是一个人。Blender和Unity这两个在各自领域都堪称顶级的工具,在三维坐标系上却有着根本性的分歧:Blender使用Z轴向上,而Unity使用Y轴向上。这个“轴向上”的差异,是无数3D美术和独立开发者从Blender转向Unity工作流时遇到的第一个,也是最顽固的“拦路虎”。
默认的Blender FBX导出器提供了“应用变换”等选项,试图弥合这个鸿沟,但实际使用过的人都知道,对于稍微复杂一点的层级结构(比如一个角色带着武器,武器上又有粒子发射器),这些选项往往会失效,导致子级物体的旋转和缩放出现难以预料的错误。手动在Unity的导入设置里调整“轴转换”也可能无济于事,尤其是处理动画时,修正起来更是噩梦。
这就是EdyJ的Blender-to-Unity-FBX-Exporter插件存在的意义。它不是一个功能庞杂的瑞士军刀,而是一把精准的手术刀,只解决一个问题:让从Blender导出的FBX文件,在导入Unity时,其旋转、缩放和层级关系与你在Blender中看到的完全一致。它通过在导出前对场景数据做一次“临时手术”,巧妙地抵消了两个软件间的坐标系差异,最终实现“所见即所得”的导入效果。对于需要频繁在Blender和Unity之间交换资源的团队或个人开发者来说,这个插件能节省大量排查和修复模型导入问题的时间,让创作流程真正流畅起来。
2. 核心原理拆解:插件如何实现“完美”导出?
这个插件的聪明之处在于它没有尝试去修改Blender或Unity的核心,而是作为一个“翻译官”,在数据交换的瞬间完成坐标转换。理解其工作原理,能帮助你在遇到一些边界情况时,知道问题可能出在哪里。
2.1 坐标系冲突的本质
Blender 使用右手坐标系,Z轴向上。这意味着,在默认的视图中,你面朝的方向是Y轴正向,右侧是X轴正向,上方是Z轴正向。 Unity 使用左手坐标系,Y轴向上。在Unity的Scene视图中,你面朝的方向是Z轴正向,右侧是X轴正向,上方是Y轴正向。
当你将一个在Blender中“站立”的模型(其局部坐标系Z轴指向天空)导出为FBX并导入Unity时,Unity期望的是一个Y轴指向天空的模型。如果不做处理,这个模型在Unity里就会“躺下”,因为它的向上轴(Z)被Unity解释成了向前轴(Z)。
2.2 插件的“临时手术”流程
插件的工作流程可以概括为“修改 -> 导出 -> 还原”:
场景快照:在导出开始时,插件首先记录整个场景中所有待导出物体的原始变换(位置、旋转、缩放)矩阵。这是为了之后能完美还原。
应用根旋转:插件遍历所有需要导出的根级物体(即没有父级,或其父级不被导出的物体)。对每一个这样的根级物体,它在不改变其几何体和子物体视觉姿态的前提下,为其变换矩阵应用一个+90度绕X轴的旋转。你可以想象成在物体的“根”上轻轻地拧了一下。
递归传播:这个旋转会通过父子层级关系递归地影响到所有子物体。由于变换矩阵的继承性,子物体会继承父级的这个旋转。插件内部会进行复杂的矩阵运算,确保子物体的视觉位置和朝向在Blender视口中看起来没有丝毫改变,但它们的内部变换数据已经包含了这个调整。
调用原生导出器:此时,场景数据在内部已经被调整为一个“面向Unity”的状态。插件随即调用Blender内置的、久经考验的FBX导出器,并使用一组预先优化好的参数(如确保使用Y向前、Z向上的FBX坐标系)进行导出。这样生成的FBX文件,其内部所有物体的旋转数据都包含了那个额外的+90度X轴旋转。
场景还原:导出完成后,插件立刻使用第一步保存的快照,将所有物体的变换矩阵恢复原状。对于用户来说,整个Blender场景在导出前后没有任何视觉变化,整个过程是无感的。
2.3 Unity端的“自动校正”
当这个被处理过的FBX文件导入Unity时,Unity的FBX导入器会按照自己的规则解析数据。由于FBX文件内部声明了Y向上,而物体数据又包含了+90度X旋转,Unity为了正确显示,会对其应用一个-90度绕X轴的旋转来进行补偿。 神奇的事情发生了:(+90度) + (-90度) = 0度。插件预先添加的旋转与Unity导入时应用的旋转相互抵消了。最终,物体在Unity中的旋转值恢复为它在Blender中的原始值,模型也就以正确的姿态“站立”在了Y轴向上的Unity世界里。
注意:这个方案的精妙在于它处理的是变换数据,而非几何顶点数据。这意味着模型的网格本身没有被修改,所有动画、骨骼权重、形状键都得以完整保留,只是整个物体的“容器”方向被调整了。这比直接修改网格顶点或烘焙变换到几何体要安全得多。
3. 3分钟极速安装与配置指南
理论上,安装这个插件确实可以在3分钟内完成。但为了确保万无一失,避免一些常见坑点,我们详细走一遍流程。
3.1 准备工作与环境确认
在开始之前,请先确认两件事:
- Blender版本:插件要求Blender 3.2及以上版本。建议使用最新的LTS(长期支持)版本,如3.6 LTS或4.0 LTS,以获得最佳的稳定性和兼容性。你可以在Blender官网的下载页面找到LTS版本。
- 获取插件文件:访问项目的GitHub页面(EdyJ/blender-to-unity-fbx-exporter)。不要直接点击绿色的“Code”按钮然后下载ZIP,那样你会下载整个仓库。正确的方法是:
- 在仓库页面找到名为
blender-to-unity-fbx-exporter.py的单个文件。 - 点击进入该文件,在右侧找到“Raw”按钮,右键点击“链接另存为...”,将其保存到你的电脑上一个容易找到的位置,比如桌面或下载文件夹。确保保存的文件后缀是
.py。
- 在仓库页面找到名为
3.2 分步安装流程
打开你的Blender,我们开始操作:
打开偏好设置:在Blender顶部菜单栏,点击
Edit(编辑) ->Preferences...(偏好设置)。进入插件管理:在偏好设置窗口左侧,选择
Add-ons(插件)选项卡。安装插件:点击窗口右上方的
Install...(安装...)按钮。这会打开一个文件浏览器。选择插件文件:导航到你刚才保存
blender-to-unity-fbx-exporter.py文件的位置,选中它,然后点击Install Add-on(安装插件)。启用插件:安装后,你会在插件列表里看到一个名为 “Import-Export: Unity FBX Exporter” 的条目。勾选它左侧的复选框以启用插件。
保存设置(关键步骤):千万不要直接关闭窗口!安装并启用插件后,务必点击偏好设置窗口左下角的
Save Preferences(保存偏好设置)按钮。这样,下次启动Blender时插件才会依然启用。很多新手会忽略这一步,导致重启后插件“消失”。
至此,插件安装完毕。你可以关闭偏好设置窗口。
3.3 验证安装与快速测试
安装完成后,最好进行一次快速验证:
- 点击Blender顶部菜单栏的
File(文件) ->Export(导出)。你应该能在导出菜单中看到一个新的选项:Unity FBX (.fbx)。 - 创建一个简单的默认立方体,尝试用这个新的导出选项导出一个FBX文件。
- 将FBX拖入Unity,检查立方体是否以正确的朝向(Y轴向上)站立在场景中。
如果能看到这个菜单项并且导出导入基本正常,说明插件安装成功。
4. 插件使用详解与高级导出选项
安装只是第一步,用好导出设置才能应对各种复杂场景。点击File -> Export -> Unity FBX (.fbx)后,会打开一个文件浏览器窗口,其右侧有丰富的导出选项面板。
4.1 核心导出范围控制
- Selected Objects Only(仅导出选中物体):这是最常用的选项之一。勾选后,插件只会导出你在Blender场景中当前选中的物体及其子级层级(如果子级未被单独选中也会被连带导出)。这对于导出场景中的特定部件非常有用。
- Exclude Collection(排除集合):这是插件一个非常强大的功能。在Blender的Outliner(大纲视图)中,集合名称旁边有一个复选框。取消勾选某个集合的复选框,该集合就会被标记为“排除”。在导出设置中勾选
Exclude Collection选项,那么所有被标记为排除的集合及其内容将不会被导出,即使其中的物体被单独选中。这为你提供了非破坏性的图层管理能力,比如你可以设置一个“调试物体”集合,导出时轻松排除它。
4.2 物体类型与数据过滤
- Object Types(物体类型):通常保持默认(Empty, Mesh, Armature)即可。这确保了空物体(用于挂载脚本或作为父级)、网格物体和骨骼 armature 都能被导出。如果你导出的场景包含灯光或摄像机,并且希望将它们也导入Unity(虽然Unity的FBX导入对灯光支持有限),可以勾选相应的选项。
- Custom Properties(自定义属性):强烈建议勾选。Blender中设置在物体上的自定义属性(如
game_object_type = “Enemy”)可以被导出并导入到Unity中。虽然Unity的默认FBX导入器不会直接将其显示为组件,但这些数据会存储在FBX文件中,你可以通过编写编辑器脚本在导入时读取并利用这些数据,实现工作流自动化。
4.3 网格与动画导出设置
- Apply Modifiers(应用修改器):如果你的模型使用了Subdivision Surface(细分曲面)、Mirror(镜像)等修改器,勾选此项会在导出前将这些修改器的效果“烘焙”到最终的网格数据中。注意:对于Armature(骨骼)修改器,通常不应在此处应用,动画需要骨骼修改器保持活动状态。
- Mesh Smoothing(网格平滑):选择“Normals Only”通常是最佳选择,它会导出面法线信息。选择“Face”会导出为硬边,模型看起来会有棱角。
- Armature(骨骼)选项:
- Primary Bone Axis(主骨骼轴):保持为“Y Axis”。这符合Unity中骨骼的常见朝向。
- Secondary Bone Axis(副骨骼轴):保持为“X Axis”。
- 这些轴设置确保了骨骼的Roll(滚动)旋转被正确解释,避免在Unity中骨骼扭曲。
4.4 实验性功能与性能考量
- Batch Mode(批处理模式):如果你需要导出场景中的多个独立物体为单独的FBX文件,这个功能非常有用。你需要为每个想要单独导出的物体设置一个特定的自定义属性(插件README中有详细说明),插件就能自动进行批量导出。
- Use Scene Unit(使用场景单位):Blender和Unity的默认单位都是1个单位=1米。通常保持勾选即可,确保比例一致。如果你在Blender中使用了不同的单位比例,需要注意此项。
5. 实战工作流:从复杂Blender场景到完美Unity预制件
让我们通过一个相对复杂的例子——一个带动画的低多边形角色——来串联整个工作流。
5.1 Blender端:场景整理与导出准备
假设你的角色名为“Hero”,包含以下结构:
Hero (空物体,根节点) ├── Body (网格物体) ├── Weapon (网格物体) └── Armature (骨骼) ├── pelvis (骨骼) ├── spine (骨骼) └── ... (其他骨骼)- 层级整理:确保你的角色有一个清晰的根节点(如名为“Hero”的空物体)。所有视觉部分(Body, Weapon)和骨骼都作为这个根节点的子级。这样做的好处是,在Unity中,你只需要拖动一个FBX文件,整个角色层级就完整无缺。
- 集合管理:将“Hero”根物体放入一个集合,比如“Characters”。你还可以创建“Debug_Spheres”集合放置一些用于定位的辅助物体。在Outliner中取消勾选“Debug_Spheres”集合旁边的复选框,将其排除。
- 设置自定义属性:选中“Hero”根物体,在Object Properties(物体属性)窗口的“Custom Properties”部分,点击“Add”添加属性。例如,添加一个名为“prefab_type”的字符串属性,值设为“PlayerCharacter”。这可以作为元数据供Unity端识别。
- 检查变换:确保所有物体的缩放(Scale)都是(1,1,1),旋转(Rotation)干净(最好是欧拉角下的0,0,0)。如果有非均匀缩放或旋转,最好在导出前应用掉(Ctrl+A -> Scale 或 Rotation)。虽然插件能处理,但干净的变换是良好实践。
- 执行导出:
- 选中“Hero”根物体。
File -> Export -> Unity FBX (.fbx)。- 在导出面板中,勾选
Selected Objects Only。 - 勾选
Custom Properties。 - 确保
Armature选项设置正确。 - 选择保存路径,点击“Export Unity FBX”按钮。
5.2 Unity端:导入设置与预制件创建
- 导入模型:将导出的FBX文件拖入Unity项目的Assets文件夹。
- 模型导入设置检查:在Inspector(检查器)窗口中,确保:
Scale Factor通常为1或0.01(取决于你的项目单位)。如果Blender和Unity都是1单位=1米,这里用1。Use File Scale取消勾选(由上面的Scale Factor统一控制)。Mesh Compression设置为Off或Low,避免模型精度损失。Read/Write Enabled如果你的脚本需要在运行时修改网格,则勾选。否则取消勾选以节省内存。Generate Colliders通常不在这里生成,我们更倾向于使用专门的碰撞体组件。
- 材质与贴图:首次导入时,材质可能显示为粉色(丢失)。这是因为Blender的材质系统(Principled BSDF)与Unity的标准着色器不直接兼容。你需要:
- 在FBX文件的Materials子文件夹下,找到导入的材质。
- 将材质的Shader从“Standard”更改为“Universal Render Pipeline/Lit”(如果你使用URP)或“HDRP/Lit”(如果使用HDRP)。
- 手动将贴图(Albedo, Normal, Metallic等)拖拽到材质球的对应槽位。对于简单的颜色,也可以直接调整Base Color。
- 更高效的做法:在Blender中,使用“Unity”风格的节点组来设置材质,或者使用第三方桥接插件,但这超出了本插件的范畴。手动重赋材质是跨平台工作流中常见的一步。
- 动画片段设置:如果FBX包含动画,在Rig(装备)选项卡中将Animation Type设置为“Humanoid”或“Generic”。在Animations(动画)选项卡中,可以切割和命名动画片段(Idle, Run, Attack等)。
- 创建预制件:将FBX文件从Project(项目)窗口拖入Hierarchy(层级)窗口或Scene(场景)视图。调整好位置后,再将其从Hierarchy拖回Project窗口,这样就创建了一个Prefab(预制件)。之后在代码中实例化这个Prefab即可。
6. 常见问题排查与避坑心得实录
即使使用了这个优秀的插件,在实际工作流中仍可能遇到一些棘手问题。以下是我和社区中总结的一些常见情况及解决方案。
6.1 模型导入后旋转/缩放依然不正确
- 检查步骤:
- 确认插件已启用:再次打开Blender偏好设置,确保“Unity FBX Exporter”插件确实被勾选。
- 检查导出选项:导出时,确保没有同时勾选Blender原生FBX导出器的“Apply Transform”选项。你只应该使用
File -> Export -> Unity FBX (.fbx)这一个路径。 - 检查物体父级:确保你要导出的物体的最顶层父级(根节点)的旋转和缩放是干净的。如果一个物体有一个在导出范围外的父级,其变换可能会被错误计算。最佳实践是为你想要导出的完整资产创建一个新的、变换清零的空物体作为根。
- 检查Unity导入设置:在Unity中,选中导入的FBX模型,在Model(模型)选项卡下,确保
Bake Axis Conversion没有勾选。这个插件导出的FBX不需要Unity再做轴转换。
6.2 动画导入后抖动或变形
- 问题根源:这通常与骨骼的旋转插值方式有关。Blender和Unity对四元数插值的处理可能略有差异。
- 解决方案:
- 在Blender中,检查Action(动作)编辑器中的关键帧。尝试将关键帧的插值类型从“贝塞尔”改为“线性”(Linear)或“常数”(Constant)进行测试,看问题是否消失。
- 在Unity的模型Rig设置中,尝试勾选
Optimize Game Objects。这个选项会移除许多冗余的变换节点,有时能解决复杂的层级动画问题。 - 确保在Blender中,骨骼的旋转模式是“四元数”(Quaternion),而不是“欧拉XYZ”。在Pose Mode(姿态模式)下选中所有骨骼,按
Ctrl+A->Rotation to Quaternion。
6.3 材质丢失或显示为粉色
- 根本原因:如前所述,这是渲染管线不匹配导致的。
- 高效处理流程:
- 不要逐个材质球修改。可以编写一个简单的Editor脚本,批量扫描项目中的材质,并将其着色器替换为当前项目管线(URP/HDRP)的标准着色器。
- 考虑在Blender中使用“glTF 2.0”格式导出材质和贴图信息,因为glTF标准对Unity的兼容性越来越好,尤其是通过Unity的GLTF导入包。但对于复杂的FBX动画工作流,FBX目前仍是更可靠的选择。
6.4 导出文件体积异常大
- 可能原因:
- 嵌入了媒体:检查导出设置,确保
Embed Textures(嵌入贴图)选项是取消勾选的。贴图应该作为外部文件(.png, .jpg)单独管理,在Unity中重新连接。 - 高精度网格:检查模型的面数。在导出前,可以考虑使用Blender的“Decimate”(精简)修改器对非关键部位的中低模进行适当减面。
- 动画数据冗余:如果动画很长或骨骼很多,数据量会很大。在Unity的动画导入设置中,可以增加
Rotation Error和Position Error的允许值,以压缩关键帧数据。
- 嵌入了媒体:检查导出设置,确保
6.5 插件与其他脚本或插件的冲突
- 现象:启用此插件后,Blender崩溃或某些功能异常。
- 排查方法:
- 在Blender偏好设置的Add-ons页面,暂时禁用所有其他第三方插件,只启用Unity FBX Exporter,测试导出是否正常。
- 如果正常,则逐个重新启用其他插件,找出冲突的插件。
- 检查冲突插件是否也修改了导出菜单或场景变换流程。常见的冲突可能来自其他FBX导出增强插件或场景管理工具。
这个Blender-to-Unity-FBX-Exporter插件是我近年来用过的、最专注于解决单一痛点且效果立竿见影的工具之一。它没有试图包办一切,而是把“坐标系对齐”这件事做到了极致。对于独立开发者或小型团队,它能立刻消除工作流中一个巨大的不确定性,让你能把精力真正集中在创作上,而不是没完没了地调试模型导入问题。记住,好的工具链不是功能最多的,而是能让环节之间衔接最顺畅的。