blender-to-unity について
blender-to-unity は、Blender のシーンから Unity のシーンへモデルを渡すスキルです。モデルの忠実度に応じた形式選択から、書き出し、読み込み、サイズ調整、確認までを案内します。
主な機能
- 01Blender から Unity へのモデル連携
- 02GLB または FBX の形式選択
- 03Unity へのアセット読み込みと配置
- 04確実なサイズ正規化
- 05FBX で失われた発光の復元
- 06スクリーンショットによる確認
活用シーン
- 01Blender のモデルを Unity のシーンへ移す
- 02GLB でアニメーションと PBR マテリアルを保持
- 03FBX 読み込み後の過大サイズを修正
- 04FBX 読み込みで失われた発光を復元
MCP 対応
接続済みの Blender と MCP for Unity のツールを使ってモデルを書き出し、読み込みます。受け渡しにはローカルファイルを使い、2つのサーバーは直接通信しません。
インストール
コマンドをコピーしてターミナルで実行します。
$
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 がそれをインポートします。2 つのサーバーが直接通信することはありません。
前提条件
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":...}}(キャメルケース) — これはグループの有効・無効にかかわらず、名前で振り分けられます。
手順
- Unity プロジェクトのパスを解決します。
mcpforunity://editor/stateを読み取り、プロジェクトのルート(エディターの dataPath の親)を確認します。エクスポート形式を決定します。- モデルにリグ、アニメーション、PBR(金属度/粗さ)、エミッション、または透明度がある場合は GLB(glTFast) — glTFast はこれらすべてを自動的に保持し、後処理は不要です(references/bridge-fidelity.md を参照)。複数マテリアルのゾーンはどちらの形式でも保持されるため、それだけでは GLB を選ぶ理由になりません。
- それ以外は FBX — glTFast がインストールされていない場合、モデルが単純なジオメトリの場合、または組み込みインポーターのヒューマノイドアバターパイプラインが特に必要な場合です。FBX ではエミッション/金属度が失われ(手順 5 でエミッションを復元)、アニメーションは
animation_typeを設定した場合のみ公開されます(手順 3)。
mcp__blender__execute_blender_codeを使って、Blender から一時パスにエクスポートします。
(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 では信頼性に欠けます(スケールに関する注記を参照)。確実な正規化は手順 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 は大文字と小文字を変更したり、1 つのマテリアルを複数のバリアントに分割したりすることがあります(EdgeCyan→EdgeCyan+EDGE_CYAN)。一致するすべてのものに設定します。グローバル Bloom ボリュームを追加し、カメラのrenderPostProcessingを有効にして、エミッションが実際に発光するようにします。 manage_camera(action="screenshot", include_image=true)を使って確認し、アセットパスとスクリーンショットを報告します。
注意事項
- スケール。 Blender のモデルはほぼ常に誤ったスケールで読み込まれます。FBX の単位処理によって、Unity では約 100 倍大きくなります。プロジェクトの Auto-normalize 設定が有効な場合に限り、
import_model_fileのtarget_sizeはインポート時にスケールを変更します。また、インポーター側の正規化は Blender の FBX では信頼性が低く、過大または過小になることがあります(例:target_size=2のモデルが 200 m と測定される)。確実に修正するには、Step 4 の「境界を測定してからlocalScaleを設定する」手順を使います。インポート時のスケールや Auto-normalize 設定に関係なく、目標サイズに確実に合わせられます。 - マテリアルとエミッション。 FBX はベースカラー/ディフューズカラーとトランスフォームを適切に保持しますが、エミッションとノードベースのカラーは保持されません。そのため、Blender のネオン/「Tron」シーン(エミッションに保存されたカラー)は、黒いアクセントのある暗いボディとしてインポートされます。修正方法は 2 つあります。(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 の場合は Step 5 を実行して Blender のエミッションを書き出し、再適用します。また、メッシュにcolor_attributes(頂点カラー)レイヤーがあるか確認してください。データは FBX で保持されますが、URP Lit では表示されません。_EmissionColorではなく、頂点カラーを読み取るシェーダーが必要です。 - glTFast は Unity 用 MCP ではオプションのため、デフォルトの形式は FBX です。「GLB import requires glTFast」というエラーが発生した場合は、FBX として再エクスポートするか、Dependencies タブから glTFast をインストールしてください。
- 形式ごとの忠実度。 references/bridge-fidelity.md には、各形式で保持される内容をテストした一覧があります。概要:GLB(glTFast) はテクスチャ、メタリック/ラフネス、エミッション、透明度、アニメーションを自動的に保持します。FBX はメタリックとエミッションを保持せず、トランスフォームアニメーションを反映するには
ModelImporter.animationType = Genericの設定が必要です。また、埋め込みテクスチャを割り当てるにはマテリアル/テクスチャの抽出が必要です。どちらもモディファイアをベイクし、ジオメトリと頂点カラーのデータを保持します(URP Lit では頂点カラーは表示されません)。どちらもプロシージャル/ノードマテリアルを保持しないため、Blender で先に画像テクスチャにベイクしてください。 - アニメーションは自動再生されません。 インポートしたクリップは、
AnimatorControllerで制御しない限りモデルを動かしません。配置されたモデルのAnimatorにはコントローラーが割り当てられていないため、動かないように見えます。execute_codeを手作業で組み立てるのではなく、manage_animation(controller_create→ クリップをループするステートとして追加 → インスタンスにcontroller_assign)でコントローラーを作成してください。bridge-fidelity の注意点 #7 を参照してください。 - 複数マテリアルの領域は保持されます。 Blender でマテリアルスロットごとに分割されたメッシュ(例:肌/シャツ/ズボンの領域)は、マテリアルが 1 つずつ割り当てられたサブメッシュとしてインポートされます。ベースカラーは GLB でネイティブに保持されるため、モデルにマテリアル領域で「服を着せる」と、その状態のまま読み込まれます。
- 受け渡すモデルは 1 つにしてください。複数モデルを処理する場合は、名前を個別に指定してループを繰り返します。
- このスキルは、API キーやファイルのバイト列を MCP ブリッジ経由で送信しません。Unity がディスクからファイルを読み込みます。
import_model_fileがコピーするのはソースファイル 1 つだけです。複数ファイルで構成されるエクスポート(外部.binを参照するテキスト形式の.gltfや、同じ場所に.mtl/テクスチャがある.objなど)の場合は、先に ZIP 化して.zipを渡してください。.gltf/.objだけを渡すと、関連ファイルが失われます。
コメント
Markdown 対応