一块MMD模型足够让人从下午折腾到深夜。具体来说就是从网上下载一个 .pmx 文件开始到它能够以正确的比例站进 Unity 的相机里期间要翻的坑一点也不比从头建模少缩放变成蚂蚁、骨骼拧成麻花、裙子原地爆炸、材质紫成葡萄、贴图乱码看不清。这周又有好几个朋友来问“Blender 和 Unity 能不能用 MMD 格式PMX 怎么导入”干脆把这几年跑的流程完整写出来。本文适用于想把二次元角色模型用在 Blender 动画、Unity 游戏或 XR 项目里的开发者和爱好者也适合那些手里攥着模型却不知道从哪一步下手的纯新手。流程的关键点其实很朴素PMX 不能直接拖进 Unity先让 Blender 做一次“翻译官”再用 FBX 这个通用格式送到 Unity。但我更想写的是这个流程背后的为什么以及那些文档里从来不写的坑。1. MMD格式到底是个啥为什么绕不开PMX1.1 PMX 与 PMD先分清老和新MMD 原本指的是日本开发者樋口优做的三维动画软件 MikuMikuDance后来大家习惯用“MMD 模型”这个词泛指那一整套模型、材质、动作文件格式。当年 MikuMikuDance 刚火起来的时候模型文件主要用 .pmd后来出现了扩展性更强的 .pmx现在网上流通的高质量二次元角色模型绝大多数都是 .pmx初音、镜音、巡音、自家原创角色基本都以 PMX 分发。PMD 和 PMX 的区别可以类比成旧版和新版游戏存档PMD 能存的东西少材质、骨骼、顶点权重都有明显上限贴图也比较老派PMX 则像结构更完整的工程文件支持多套 UV、多权重蒙皮、更丰富的材质标签整体表达力强很多。实际使用中如果项目需要最新模型或精细脸部表情PMX 是绕不开的。PMX 本身是 MMD 社区约定俗成的格式不是某个大厂标准但它把这些年积累的二次元角色制作经验都封装在了一个文件里。也就是说一个 PMX 模型不只是“一个模型”而是“模型材质骨骼表情物理的一整套包”。理解了这一层后面所有转换步骤就都好解释了为什么从 PMX 到 Blender 到 Unity每一步都要小心谨慎因为每一步都可能丢东西。1.2 拆开一个PMX里面到底装了什么很多人第一次导入 PMX 到 Blender 会吓一跳怎么场景里多出来几十个透明方块、胶囊体、球体别慌这些不是垃圾是模型自带的物理碰撞体。一个完整的 PMX 里至少有这几类内容网格数据顶点坐标、法线、UV、顶点权重。权重定义了每个顶点受哪几根骨骼影响一般最多 4 根骨骼。材质信息每个网格片段对应怎样的贴图、Toon 渐变贴图、透明度、双面渲染开关、轮廓线宽度等。骨骼系统负责蒙皮变形的骨架包含旋转骨骼、IK 链、扭曲骨骼、外部连接骨骼。MMD 的骨骼命名是日文体系比如“センター”“上半身”“首”“両目”等。刚体与关节裙摆、头发、饰品上的物理模拟体系原本基于 Bullet 物理引擎参数非常多。Morph 表情眨眼、张嘴、笑、悲伤这些表情本质上是顶点位移对应到 Blender 里叫 Shape Keys对应到 Unity 里叫 BlendShape。可以把 PMX 想成一个自带弹簧、表情和服装的乐高小人。网格是外壳骨骼是内部关节刚体是关节上的弹簧材质是皮肤颜色和衣服反光表情则是一整套可切换的脸部形状。这个整体性既是 MMD 格式方便的地方也是转换后容易出问题的根源如果只导出 mesh 而丢弃骨骼角色就会变成一块不会动的橡胶如果丢了刚体和关节裙子就会直接刺穿大腿如果丢了 Morph角色就永远只有一个表情。2. Blender侧从导入到能编辑2.1 免费开源的Blender MMD Tool怎么装Blender 原生并不认识 PMX所以第一步是装插件。最常用、更新最勤的插件叫 blender_mmd_tools开源、免费GitHub 上可以直接下到 zip。安装方式非常简单打开 Blender进入 Edit Preferences Add-ons点 Install选中下载好的 zip 包然后在插件列表里搜索“MMD Tools”勾选启用。版本上Blender 3.6 LTS 和 4.x 都能跑但如果你的插件版本很旧建议优先用 3.6 LTS兼容性最省心。安装完成后File Import 菜单里会出现 MikuMikuDance Model (.pmx/.pmd) 和 MikuMikuDance Animation (.vmd)。先导入模型后面再导入动作。导入时左侧面板会有一堆参数最重要的几个是 Scale 缩放、轴向上、刚体导入、材质转换。Scale 默认是 0.08这个数字背后有讲究MMD 的角色在软件内部大概有 20 个网格单位高乘上 0.08 就变成 1.6 米左右正好落在 Blender 和 Unity 的人形角色习惯尺寸上。除非你有特殊需求否则不要改。注意不要在第三方网站上乱下载“整合版 MMD 插件”很多会把木马和广告脚本打包进去。直接用开源仓库版本既能看代码也更安全。2.2 导入后的整理必修课PMX 导入后Outliner 里会出现一大串对象角色网格、骨架、一堆带碰撞形状的空物体。第一件事不是兴奋地去拖动画而是做一次清理。先选中所有网格和骨架看 Transform 面板里的位置和旋转是否干净。没有特殊情况的话Blender MMD Tool 导入时已经处理了单位和轴向角色应该站在原点附近、面朝前方。如果模型是横躺的多半是导入时“Axis Up”设成了 Z而 MMD 习惯是 Y 轴向上把这些值改掉再重新导入一次比手动旋转靠谱得多。接下来处理骨骼命名。MMD 自带日文骨名在中文或英文系统下不一定乱码但在 Unity 的 Avatar Mapping 阶段会非常痛苦。推荐用插件自带的“MMD Utilities”菜单里的 bone name translation 功能把日文骨名转成英文。注意只转名称就够了不要手动重命名太多骨骼否则后续导入 VMD 动作时会出现骨骼对应不上、动画整体错位的情况。所有网格的 Scale 也要应用掉快捷键 CtrlA 选择 All Transforms。这一步极其重要如果网格对象的缩放还停留在 0.08 或某个旧值导出 FBX 后 Unity 里的角色就可能变成蚂蚁或巨人。刚体方面PMX 导入后产生的那些透明胶囊和方块在 Blender 里不要尝试用自带的物理引擎去模拟裙摆和头发。MMD 的刚体参数、旋转限制、分组规则基于 Bullet 引擎导入到 Blender 后被简化模拟结果必然飘、抖动、穿模我试过几次最后还是放弃了。如果你的目标是把角色送进 Unity干脆在导出前隐藏或删掉这些碰撞体留到 Unity 再用专门的骨骼物理方案。2.3 导出FBX的必要设置在 Blender 里处理好模型后进入 File Export FBX。对象选择务必同时选中角色网格和骨架不要只选一个。导出设置里把 Scale 选项设成 FBX All Properties向上轴选 Y 轴前向轴选 -Z 方向这套配置基本是 Unity 的标准姿势。如果模型带 Shape Keys 表情导出时不要取消“Apply Modifiers”。FBX 导出的 BlendShape 信息依赖修改器计算结果。如果有骨骼动画勾选 Bake Animation并把时间线范围设置成你想要的动作长度。注意帧率MMD 的动作数据通常是 30fpsBlender 默认是 24fps如果不改场景帧率导入 VMD 后播放速度会明显比原版慢得提前在 Scene Properties 里把 Frame Rate 改成 30。实操心得导出前检查一次修改器列表。如果有未应用的 Mirror、Array 或 Solidify 修改器最好 CtrlA 应用掉否则 FBX 里的网格可能保留大量看不见的隐藏面Unity 里阴影和碰撞都会出问题。导出后得到的 FBX 文件会连带一份贴图路径引用记得把整个 FBX 和 textures 文件夹一起放到 Unity 的 Assets 目录下路径里的非英文字符最好提前改掉否则 Unity 经常找不到贴图。3. Unity侧PMX怎么变成能跑的Unity资产3.1 为什么不能直接把PMX拖进UnityUnity 原生不支持 PMX这一点在文档里写得很明确但每年照样有很多人把 PMX 拖进 Project 窗口然后愣住。市面上确实有一些第三方导入器比如 MMD4Mecanim 这类工具可以直接把 PMX 和 VMD 读进 Unity还自带骨骼映射和物理转换。但这类插件普遍面临旧版本兼容问题在较新的 Unity 版本上动不动就报错而且授权和分发条款也有限制。所以我的主力流程还是先转 FBX 再进 Unity。FBX 是 Unity 原生友好格式能带网格、骨骼、BlendShape 和动画而且不依赖任何第三方运行时。代价是刚体关节信息会丢失但在 Unity 里MMD 的刚体系统本来也不兼容 PhysX丢了反而干净。导入 FBX 后Unity 会以 Generic 或 Humanoid 两种方式识别角色。二次元 MMD 角色我建议直接用 Humanoid前提是骨骼映射能正确适配。选中 FBX 的 Import Settings在 Rig 选项卡里选 Humanoid然后点 Configure把模型的骨骼对照人类骨架一一拖上去。MMD 骨名转英文后通常“センター”对应 Hips“上半身”对应 Spine“頭”对应 Head手臂和手对应的骨名也比较直观。如果找不到完全匹配的骨可以留空Unity 会自动推断但结果不一定准手动指定最稳妥。如果某个模型在 Humanoid 模式下总扭成麻花一个临时方案是改用 Generic用 Animator 播放其他动画时限制更多但至少模型不会变形发疯。3.2 材质与Shader的关键替换FBX 导入 Unity 后默认材质往往是 Standard PBR。直接把二次元角色放上去材质会油腻得像橡胶手办完全失去动漫质感。所以材质替换是必做项目。主流选择是 MToon 这个卡通渲染 Shader。它是开源社区广泛使用的 MMD 向 Unity 材质支持基础色、ShadeMap 明暗渐变、自发光、轮廓线、双面渲染。在 Unity 内置渲染管线下找带 MToon 的 shader 文件一路 Setup 即可如果是 URP 项目需要找对应的 MToon URP 版参数与内置版略有差异。我的建议是如果项目刚起步且不需要高端渲染特性直接留在内置渲染管线能省一大堆坑。替换材质时不要一个个手动换场景里可能有几十个材质。写一个简单的 Editor 脚本批量改 Shader 并保留贴图引用效率高很多。这里给个参考思路using UnityEditor; using UnityEngine; public class MMDToonSwitcher : EditorWindow { [MenuItem(Tools/MMD/Switch To MToon)] static void SwitchToMToon() { Shader shader Shader.Find(MToon/MToon); if (shader null) { Debug.LogError(MToon shader not found.); return; } foreach (var obj in Selection.objects) { var mat obj as Material; if (mat null) continue; Texture mainTex mat.mainTexture; mat.shader shader; if (mat.HasProperty(_MainTex)) mat.SetTexture(_MainTex, mainTex); if (mat.HasProperty(_ShadeMap)) mat.SetTexture(_ShadeMap, mainTex); if (mat.HasProperty(_ShadingShift)) mat.SetFloat(_ShadingShift, 0.1f); if (mat.HasProperty(_OutlineWidth)) mat.SetFloat(_OutlineWidth, 0.02f); if (mat.HasProperty(_CullMode)) mat.SetFloat(_CullMode, 0f); } } }脚本里的参数版本可能随 MToon 版本不同有差异但思路就是“先保留主贴图和基础色再替换 Shader再设置关键参数”。_CullMode 为 0 时表示关闭背面剔除也就是双面渲染头发和大裙摆经常需要这个设置不然正反面穿帮。双眼和屏幕类自发光材质还需要把 Emission 调高否则眼睛看起来灰扑扑的。眼珠通常是独立网格用同一个材质但带自发光贴图在 MToon 里把 Emissive 通道接上贴图即可。经验之谈不要迷信“一键 PBR 转换”MMD 模型的贴图本来就是按卡通效果做的强行转换成 PBR 流程会得到一张糊满脏垢的脸。卡通角色就老老实实用卡通 Shader。3.3 物理裙摆和头发别硬来Unity 的物理引擎是 PhysXMMD 的刚体关节是 Bullet两者参数完全不互通。如果你在 FBX 导出时保留了那些碰撞体再在 Unity 里给它们加上 Rigidbody 和 Joint很快会体会到什么叫“角色原地爆炸”。骨骼关节的 spring、damper、旋转限制转换后基本全部丢失几个参数不对就是原地蹦迪。正确的做法是彻底放弃 MMD 原生刚体在 Unity 里用骨骼级物理组件去模拟需要动的部件。Dynamic Bone 和 Magica Cloth 是两个常用方向。Dynamic Bone 适合头发、双马尾、飘带、裙摆这类“骨链软体”配置简单移动端性能好但精度有限Magica Cloth 是网格级布料效果更真实消耗也更大。对大多数 MMD 角色Dynamic Bone 先解决 90% 的问题就够了。配置 Dynamic Bone 时最关键的是选对 Root 根骨骼。比如裙子根骨骼要选定裙子骨架链条的最顶端不要直接选整条骨架否则模拟范围会把上半身和头部也带飞。碰撞体方面给躯干、大腿、小腿分别加 Collider大小要紧贴角色表面但又不要太厚。太厚的话头发或裙摆会被“弹”出去看起来像触电抽搐。物理参数先给保守值Damping 高一点Elasticity 低一点跑起来不会太疯。一个裙摆大概要花一小时调参才能自然晃动这是正常过程别指望一次到位。4. 动作、表情与动画混合4.1 VMD动作文件怎么变成Unity循环动画VMD 是 MMD 的动作数据文件。放在 Blender 里的处理方式是File Import MikuMikuDance Animation (.vmd)导入时选择目标骨架。前提是骨架的骨名和导入 VMD 时模型自带的骨名一致如果你之前手动改了太多骨名动作可能完全对不上。导入动作后建议先在 Blender 里检查时间范围把不需要的尾帧删掉并确保场景帧率是 30。MMD 默认帧率 30Blender 默认 24不改会让这段舞蹈慢悠悠地播看着非常难受。VMD 还会把表情关键帧一起带进来Blender 会自动写进 Shape Keys 的时间线导出 FBX 后这些都会变成 Unity 里的 Animation Clip 和 BlendShape 驱动。导出 FBX 并导入 Unity 后在 Animation 选项卡里把 Clip 的 Loop Time 勾上循环舞蹈就能无缝循环。MMD 动作大多是原地动作根骨骼几乎没有平移所以在 Unity Animator 里可以直接当普通动画播放不需要额外处理 root motion。如果你要角色一边移动一边播放动作控制好 Animator 的 Apply Root Motion 即可多数情况建议关闭。如果项目有 VR 需求比如 Pico4 或 PC VR 开发切忌让 VMD 动画直接驱动角色全身。VR 的头部和手部必须由玩家设备实时控制身体责任另一套 IK 系统一次强行播放 VMD 会让用户直接眩晕。4.2 Morph表情与Unity BlendShapeMMD 的表情在 Blender 里叫 Morph转换成 Shape Keys 后FBX 导出到 Unity 就成为 SkinnedMeshRenderer 里的 BlendShape。导入成功后可以在 Unity Inspector 里看到一长串列表比如“まばたき”“あ”“い”“笑”等。想要运行时控制表情直接用 SkinnedMeshRenderer 的接口就行SkinnedMeshRenderer renderer GetComponentSkinnedMeshRenderer(); int index renderer.GetBlendShapeIndex(blink); if (index 0) { renderer.SetBlendShapeWeight(index, 100f); }用名字而不是下标来找 BlendShape因为不同模型导出后的顺序不一定一致。如果做对话口型预先在 Animator 里建好状态机对不同 BlendShape 权重打关键帧比在代码里逐帧算要稳定。常见的问题是某些模型在 Blender 里明明有 50 个 Shape Keys导入 Unity 后只剩 10 个。大概率是导出 FBX 时没有勾选包含 Shape Keys 的选项或者网格对象的修改器状态不对。FBX 导出器里如果模型带 Shape Keys默认会导出 BlendShape如果你在导出前误删了形变键那就只能重新导入一次 PMX。如果眼睛、眉毛、嘴部有多套表情由不同 Morph 组合而成比如“悲伤”需要嘴部向下和眉毛上挑同时触发建议把这些组合放进 Animator 的 BlendTree切换时能得到平滑过渡。MMD 社区的表情资源很丰富先下载一套标准表情再改 BlendShape 权重能快速做出角色说话和眨眼效果。5. 常见问题与排查技巧实录5.1 贴图紫/黑路径和乱码症状Blender 导入 PMX 后材质显示洋红色或纯黑色。这通常是贴图加载失败原因是 PMX 内部记录贴图路径用的是日文 Shift-JIS 编码中文系统下读取容易乱码文件名里有特殊字符还会直接丢。解决解压模型文件夹后先把所有贴图文件名改成语拼音或英文再导入。导入时勾选插件提供的纹理复制选项把贴图复制到项目目录。如果还是紫的打开 Shader Editor找到 Image Texture 节点手动重新指定贴图文件。在 Unity 那边紫材质同理检查 FBX 旁的 Textures 文件夹是否完整预览窗口里可以用 Extract Textures 把贴图提取出来重新关联。5.2 模型变成蚂蚁/巨人缩放与单位症状角色在 Unity 里身高 0.01 米或者顶天立地 300 米。原因在 Blender 导出 FBX 时缩放没有统一。进 Unity 后检查 Import Settings 里的 Scale Factor如果数值变成 0.01 或 100说明 Blender 那边对象 Scale 没有应用。回到 Blender选中网格和骨架CtrlA 应用全部变换再导出一次。正常人形角色 1.6 米左右导入 Unity 后高度在半个人到一人高之间都正常。5.3 骨骼错乱与物理炸裂骨骼错乱多出现在 Humanoid 映射阶段。MMD 骨骼的命名、层级和标准人形骨架有差异某个骨骼映射错误角色就会四肢扭曲或头部旋转 180 度。解决办法是按前面说的在 Configure Avatar 面板里手动把骨名拖到对应槽位别偷懒。如果实在找不到对应骨骼就强迫角色用 Generic 模式脖子以上和四肢动画单独控制虽然不能享受人形重定向但至少模型不会坏。物理炸裂的根源就是刚体冲突和 Joint 参数异常。排查时先在 Hierarchy 里看是否有大量 Activation 抖动删掉所有带 Rigidbody 的碰撞体组件改用骨骼物理方案。历史经验是一个建模精细的 MMD 角色物理炸裂几乎全是“贪多”造成的什么都用物理模拟结果什么都不稳定。5.4 渲染问题阴影、双面、描边阴影异常是 MMD 角色在 Unity 里最常见的问题。角色头部阴影斑驳、裙子内侧透光、描边粗得像涂了黑胶带。首先检查 MToon 的 ShadeMapMMD 的渐变阴影贴图如果没接对阴影会变成死黑或乱闪。其次检查法线部分 MMD 模型的法线不统一Blender 里可以全选网格后 Recalculate Outside 修复。双面渲染要按部件设置裙子和头发的 _CullMode 设 0面部身体设 2 也就是正常背面剔除防止内外同时绘制导致性能浪费。轮廓线如果过于明显把 _OutlineWidth 调低MToon 的宽度单位是模型空间里的长度一般 0.01 到 0.03 就够。如果想要局部描边效果更细腻可以配合 Outline Color Mask 贴图单独控制哪些部位画线。这里顺便提一下 Unity 版本的事如果你用的是未激活的 Unity 项目会有 Trial Version 水印覆盖渲染画面很多教学截图里看不到但你实际做出来会多一个窗口标识。学习测试无所谓正式开发和对外发布赶紧用官方个人版并按规则激活别让水印拖累了你调试好的项目。5.5 包体、层级与移动端优化MMD 模型面数普遍偏高贴图动辄 4K直接放进移动端项目或者微信小游戏包体和加载速度都会很难看。建议进 Unity 后先看一眼 Mesh 的三角面数和贴图尺寸把不需要的贴图降为 1024 或 2048模型面数过高就减面一次。合并材质时也要谨慎MMD 模型一个个部件本身就有不同材质参数强行合批会出现全角色一个颜色的惨剧。如果你在做战斗系统技能指示器这种 UI 层叠加在角色脚底注意 Layer 分层让 UI 和角色不互相遮挡、不在同一个渲染通道里争抢。MMD 角色的阴影和过滤最好单独设置避免技能特效的广告牌元素投影到角色身上看起来像是在角色脸上打了一束光。我的习惯是模型转换完成、第一次在 Unity 里跑顺之后立刻做一个 Maker 存档。这个存档包含角色预设、材质模板、物理根骨骼配置、表情 BlendTree 和 Animator 控制器。之后导入新模型只需要在存档基础上替换 mesh 和贴图能省半天时间。先写到这里。我自己的流程现在基本固定成PMX → Blender 清理并转英文骨骼名 → 导出 FBX → Unity 导入 → MToon 替换材质 → Dynamic Bone 做头发和裙子 → 导入 VMD 动作档 → 调 BlendShape 眨眼。这套流水线跑过不知道多少次说不上完美但至少能让一块 MMD 模型在一天之内活蹦乱跳地进游戏场景。最后提醒一点每个模型都可能藏着奇怪的命名和材质结构别指望一个“一键方案”通吃所有版本保留好原始 PMX 文件任何一步搞砸了回到起点重新导入一次远远比在中间层瞎修要快得多。