mcpField
B
blender-to-unity

blender-to-unity

github.com/coplaydevクリエイティブ・メディア15.5k54 回インストール1 週間前に更新
リポジトリ

blender-to-unity について

blender-to-unity は、Blender のシーンから Unity のシーンへモデルを渡すスキルです。モデルの忠実度に応じた形式選択から、書き出し、読み込み、サイズ調整、確認までを案内します。

主な機能

  1. 01Blender から Unity へのモデル連携
  2. 02GLB または FBX の形式選択
  3. 03Unity へのアセット読み込みと配置
  4. 04確実なサイズ正規化
  5. 05FBX で失われた発光の復元
  6. 06スクリーンショットによる確認

活用シーン

  1. 01Blender のモデルを Unity のシーンへ移す
  2. 02GLB でアニメーションと PBR マテリアルを保持
  3. 03FBX 読み込み後の過大サイズを修正
  4. 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":...}}(キャメルケース) — これはグループの有効・無効にかかわらず、名前で振り分けられます。

手順

  1. Unity プロジェクトのパスを解決します。 mcpforunity://editor/state を読み取り、プロジェクトのルート(エディターの dataPath の親)を確認します。エクスポート形式を決定します。
    • モデルにリグ、アニメーション、PBR(金属度/粗さ)、エミッション、または透明度がある場合は GLB(glTFast) — glTFast はこれらすべてを自動的に保持し、後処理は不要です(references/bridge-fidelity.md を参照)。複数マテリアルのゾーンはどちらの形式でも保持されるため、それだけでは GLB を選ぶ理由になりません。
    • それ以外は FBX — glTFast がインストールされていない場合、モデルが単純なジオメトリの場合、または組み込みインポーターのヒューマノイドアバターパイプラインが特に必要な場合です。FBX ではエミッション/金属度が失われ(手順 5 でエミッションを復元)、アニメーションは animation_type を設定した場合のみ公開されます(手順 3)。
  2. mcp__blender__execute_blender_code を使って、Blender から一時パスにエクスポートします。
    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)
    
    (glTF の場合: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 では、別の開いているシーンが気づかないうちにエクスポートされることがあります。)
  3. 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 で行います。
  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;
    
  5. FBX で失われたエミッションを復元します(FBX の場合)。 Blender のシーンでは、色や発光が マテリアルのエミッション(およびその他の Principled ノード入力)に保存されていることがよくあります。FBX はベースカラー/拡散色を保持しますが、エミッションは保持しません。そのため、ネオンや「Tron」風のシーンは、黒いアクセントのある暗いボディとしてインポートされます。Blender と比べてフラットに見える場合は、次の手順で復元します。 a. execute_blender_code を使って、エミッションを持つマテリアルを Blender から出力します。
    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))
    
    b. Unity で 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 を有効にして、エミッションが実際に発光するようにします。
  6. 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 だけを渡すと、関連ファイルが失われます。

コメント