关于 blender-to-unity
blender-to-unity 是将 Blender 场景中的模型交接到 Unity 场景的技能,指导导出、导入、尺寸调整与验证,并根据模型保真需求选择格式。
主要功能
- 01Blender 到 Unity 模型交接
- 02选择 GLB 或 FBX 导出
- 03Unity 资源导入与放置
- 04确定性尺寸归一化
- 05恢复 FBX 丢失的自发光
- 06通过截图进行验证
适用场景
- 01将 Blender 模型移入 Unity 场景
- 02用 GLB 保留动画和 PBR 材质
- 03修正 FBX 导入模型尺寸过大
- 04恢复 FBX 导入时丢失的自发光
MCP 相关
使用已连接的 Blender 和 MCP for Unity 工具导出并导入模型。交接通过本地文件完成,两个服务不会直接通信。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ coplaydev/ unity-mcp --skill blender-to-unity安装后在 Claude Code 中输入/blender-to-unity确认已加载。
附带文件manual-verify.mdreferences/bridge-fidelity.md
详细介绍
Blender → Unity 模型交接
将 Blender 中当前的模型导入已打开的 Unity 场景。两者通过本地文件系统衔接:Blender 导出文件,Unity 导入文件。两个服务之间不会直接通信。
前提条件
mcp__blender__*工具和 MCP for Unity 工具均已连接。- Blender 场景中存在模型(使用
mcp__blender__get_scene_info/mcp__blender__get_object_info确认)。如果场景为空,请停止并告知用户——此技能不会生成模型。 import_model_file位于asset_gen工具组中,而该组默认处于关闭状态(默认只加载core)。请先使用manage_tools启用asset_gen组,或者直接通过batch_execute调用 C# 处理程序——{"tool":"import_model_file","params":{"sourcePath":...,"name":...,"outputFolder":...}}(camelCase) ——该调用会按名称分发,不受工具组启用状态限制。
步骤
- 解析 Unity 项目路径。 读取
mcpforunity://editor/state,获取项目根目录(编辑器 dataPath 的父目录)。确定导出格式:- 当模型带有骨骼绑定、动画、PBR(金属度/粗糙度)、自发光或透明效果时,使用 GLB(glTFast) — glTFast 会自动保留这些属性,无需后处理(参见 references/bridge-fidelity.md)。多材质区域在两种格式中都会保留,因此仅有多材质区域并不足以要求使用 GLB。
- 否则使用 FBX — 适用于未安装 glTFast、模型仅包含普通几何体,或你明确需要使用内置导入器的 humanoid-avatar 工作流的情况。FBX 会丢失自发光/金属度(步骤 5 会恢复自发光),只有设置
animation_type后才会显示动画(步骤 3)。
- 从 Blender 导出到临时路径,通过
mcp__blender__execute_blender_code执行:
(glTF 分支:import bpy, os, tempfile out = os.path.join(tempfile.gettempdir(), "blender_to_unity.fbx") # Export the selection if any, else the whole scene: bpy.ops.export_scene.fbx(filepath=out, use_selection=bool(bpy.context.selected_objects), apply_unit_scale=True, bake_space_transform=True) print(out)out_glb = os.path.join(tempfile.gettempdir(), "blender_to_unity.glb"),然后执行bpy.ops.export_scene.gltf(filepath=out_glb, export_format='GLB', use_active_scene=True)— 其默认值use_active_scene=False可能会悄悄导出另一个已打开的场景。) - 使用
import_model_file导入到 Unity:import_model_file(source_path=<temp path>, name=<asset name>, target_size=<final size in meters>)。 对于带骨骼绑定/动画的 FBX,还要传入animation_type="generic"(或"humanoid";"legacy"用于旧版 Animation 组件系统)— 导入器默认值为"none",会有意将网格导入为零个动画片段。GLB 会忽略此参数(glTFast 会自行导入动画),因此该参数仅适用于 FBX。 返回{ asset_path, asset_guid }。将target_size设为预期的最终尺寸,但仅将其视为提示:只有项目启用了 Auto-normalize 偏好设置时,导入时才会重新缩放;即使启用,对 Blender FBX 也不可靠(参见 Scale 说明)。步骤 4 会进行可靠的尺寸归一化。 - 将模型放入场景,并归一化到目标尺寸。 确保场景中有摄像机和定向光(使用
manage_scene/manage_gameobject)。通过manage_gameobject(action="create", prefab_path=<asset_path>, name=<asset name>, position=[x,y,z])在选定位置实例化模型。 然后以确定的方式归一化其尺寸 — Blender FBX 导入后通常会大约放大 100 倍 — 测量放置后模型的世界边界,并缩放模型,使其最大尺寸等于目标尺寸。通过execute_code运行(替换对象名称和目标尺寸,单位为米):var go = GameObject.Find("<asset name>"); var rs = go.GetComponentsInChildren<Renderer>(); var b = rs[0].bounds; for (int i = 1; i < rs.Length; i++) b.Encapsulate(rs[i].bounds); float maxDim = Mathf.Max(b.size.x, Mathf.Max(b.size.y, b.size.z)); float target = 2f; // intended size in meters if (maxDim > 0.0001f) go.transform.localScale *= target / maxDim; - 恢复 FBX 丢失的自发光效果(FBX 路径)。 Blender 场景通常会将颜色/辉光存储在材质自发光(以及其他 Principled 节点输入)中。FBX 会保留基础色/漫反射颜色,但不会保留自发光,因此霓虹灯 /“Tron”场景会导入为暗色主体和黑色点缀。如果导入效果相较 Blender 显得平淡,请恢复自发光:
a. 通过
execute_blender_code从 Blender 导出自发光材质:
b. 在 Unity 中(使用import bpy, json out = {} for m in bpy.data.materials: if not (m.use_nodes and m.node_tree): continue col, s = (0, 0, 0), 0.0 p = next((n for n in m.node_tree.nodes if n.type == 'BSDF_PRINCIPLED'), None) es = next((k for k in ('Emission Color', 'Emission') if p and k in p.inputs), None) # 4.x / 3.x name if es: col = tuple(p.inputs[es].default_value)[:3] s = float(p.inputs['Emission Strength'].default_value) e = next((n for n in m.node_tree.nodes if n.type == 'EMISSION'), None) if e and s == 0: col = tuple(e.inputs['Color'].default_value)[:3]; s = float(e.inputs['Strength'].default_value) if s > 0 and sum(col) > 0.01: out[m.name] = [round(col[0], 3), round(col[1], 3), round(col[2], 3), round(s, 3)] print(json.dumps(out))execute_code):提取 FBX 的材质,使其可编辑 (对每个Material执行AssetDatabase.ExtractAsset,然后执行ImportAsset(fbx, ForceUpdate)),再对每个导出的名称设置_EmissionColor = color * Mathf.Clamp(strength*0.45f, 1.5f, 5f)、EnableKeyword("_EMISSION")和globalIlluminationFlags = RealtimeEmissive。以不区分大小写的方式匹配名称 — FBX 可能会更改大小写,并将一个材质拆分成多个变体 (EdgeCyan→EdgeCyan+EDGE_CYAN);对每个匹配项都进行设置。添加全局 Bloom volume,并启用摄像机的renderPostProcessing,使自发光真正产生辉光。 - 验证:使用
manage_camera(action="screenshot", include_image=true),并报告资源路径和截图。
注意事项
- 缩放。 Blender 中的模型导入 Unity 时,缩放几乎总是不正确——其 FBX 单位处理会导致模型在 Unity 中放大约 100 倍。只有在项目启用了 Auto-normalize 首选项时,
import_model_file的target_size才会在导入时调整缩放;而对于 Blender FBX,其导入器级别的标准化并不可靠(可能调整过大或过小,例如target_size=2的模型测量结果为 200 m)。可靠的解决方法是执行第 4 步中的测量边界并设置localScale流程,无论导入缩放或 Auto-normalize 首选项如何,都能确定性地达到目标尺寸。 - 材质与发光。 FBX 可以正常保留基础色/漫反射颜色和变换,但会丢弃发光和任何基于节点的颜色——因此,Blender 霓虹灯/“Tron”场景(颜色存储在发光属性中)会以暗色主体和黑色装饰导入。有两种解决方法:(a) 安装了 glTFast 时优先使用 glTF/GLB——glTF 的 PBR 模型原生支持
emissiveFactor和KHR_materials_emissive_strength,因此无需后续处理即可保留发光属性(bpy.ops.export_scene.gltf(filepath=out, export_format='GLB', use_active_scene=True));(b) 使用 FBX 时,执行第 5 步,导出 Blender 的发光属性并重新应用。还要检查网格是否有color_attributes(顶点颜色)层——FBX 会保留其数据,但 URP Lit 不会显示这些颜色;这需要使用能读取顶点颜色的着色器,而不是_EmissionColor。 - FBX 是默认格式,因为 Unity 的 MCP 中 glTFast 是可选的。如果导入时报错 "GLB import requires glTFast",请重新导出为 FBX(或从 Dependencies 选项卡安装 glTFast)。
- 格式保真度。 references/bridge-fidelity.md 是一份经过测试的各格式支持内容对照表。总结:GLB (glTFast) 会自动保留纹理、金属度/粗糙度、发光、透明度和动画;FBX 会丢弃金属度和发光,需要设置
ModelImporter.animationType = Generic才能显示变换动画,并且需要提取材质/纹理才能分配嵌入的纹理。两种格式都会烘焙修改器并保留几何体和顶点颜色数据(URP Lit 不会显示顶点颜色)。两种格式都不会保留程序化/节点材质——请先在 Blender 中将其烘焙为图像纹理。 - 动画不会自动播放。 导入的动画片段不会驱动模型,除非由
AnimatorController驱动——放置的模型带有一个控制器为 null 的Animator,所以看起来会静止。请使用manage_animation(controller_create→ 将动画片段添加为循环状态 → 将controller_assign分配给实例)来创建控制器,而不要手动编写execute_code。参见桥接保真度注意事项 #7。 - 多材质区域会保留。 在 Blender 中按材质槽拆分的网格(例如皮肤/衬衫/裤子区域)会以每个子网格对应一种材质的形式导入——GLB 会原生保留基础色——因此你可以用不同材质区域为模型“穿衣”,导入后仍会完整保留。
- 每次交接只处理一个模型;批量处理时,请使用不同名称重复此流程。
- 此技能不会通过 MCP 桥接发送 API 密钥或文件字节——Unity 会从磁盘读取文件。
import_model_file只会复制单个源文件;对于多文件导出(带外部.bin文件的文本.gltf,或带同级.mtl/纹理文件的.obj),请先将其压缩为 zip,再传入.zip文件——直接传入.gltf/.obj会导致其关联文件丢失。
评论
支持 Markdown