メインコンテンツまでスキップ

複数Unityインスタンスのルーティング

複数のUnity Editorを同時に開き、1つのMCP sessionから操作対象を切り替えられます。

主な用途

  • 共通packageを変更し、2つのprojectで同じ変更を検証する
  • Unity LTSとUnity 6の挙動を比較する
  • runtime projectとtooling projectを同時に接続する
  • 普段のprojectとCI fixture projectを並行して扱う

instanceの識別方法

接続したUnity EditorはName@hash形式の安定したIDを通知します。

  • Name — Player Settingsのproject productName
  • hash — project pathから計算した安定した8文字hash

例: MyGame@a1b2c3d4

次の指定方法も利用できます。

  • hash prefix — 例: 他と重複しなければa1b
  • port number — stdio通信のみ

instanceを確認する

次のresourceを読み取ります。

mcpforunity://instances

現在接続中のEditorについて、Name@hash、project path、transport、portを返します。多くのMCP clientではunity_instances resourceとして表示されます。

sessionのactive instanceを設定する

set_active_instance(instance="MyGame@a1b2c3d4")

設定後は、変更するまで同じsession内の後続tool callがそのinstanceへ送られます。通常は最初に1回選び、その後は普通にpromptを続けます。

次の指定も可能です。

set_active_instance(instance="a1b") # hash prefix
set_active_instance(instance="6401") # port number(stdioのみ)

session既定値を変えず1 callだけ別instanceへ送る

個別tool callにunity_instanceを渡します。

manage_scene(action="get_hierarchy", unity_instance="MyGame@a1b2c3d4")

「2つのprojectから同じscriptを読み、差分を比較する」のようなpromptで有効です。set_active_instanceと同様、Name@hash、hash prefix、stdioではport numberを使用できます。

active instance未設定時

  • Unity Editorが1つだけ接続 → 自動的にそのinstanceを使用します。
  • 複数Editorが接続しactive未設定 → 利用可能なinstance一覧を含むerrorになります。set_active_instance後に再実行します。

HTTPとstdioの違い

  • HTTP — instance状態はMCP session(MCP-Session-Id)単位です。同じPython serverへ接続した複数clientが、それぞれ別のEditorを選べます。
  • stdio — clientごとにPython processが分かれるためport numberの省略指定も使え、session keyはsubprocessごとのUUIDです。

routingのkeyはsessionです。client idそのものではありません。

複数agentから1つのEditorを操作する場合

routingは「どのEditorへ送るか」を決めます。複数agentが同じEditorへ同時にcallする場合、Unity側は1 commandずつ実行します。受信loopは各commandの完了を待ってから次のframeを読むため、同時callは重ならずqueueされます。

高負荷時は通常よりlatencyが伸びます。batchにしてもUnity側の処理throughput自体は大きく増えません。

またdomain reload中はinstance registryが一時的に空になり、次のようなerrorが出ることがあります。

Instance 'MyGame@a1b2c3d4' not found. Available: none.
Read mcpforunity://instances for current sessions.

この場合、Editor自体は生きており、再登録の短いwindowにcallが重なっただけのことがあります。instance解決時点で失敗したcallはUnityへ届いていないため、副作用は発生していません。

ただしretryは常に安全ではありません。 idempotency keyは無いため、timeoutしたcommandがUnity側で既に実行中だった場合、同じcommandを再送すると二重適用になる可能性があります。

serverが失敗と判断した時点影響retry
dispatch前(instance解決失敗)なし安全
queue中で未実行(connection切断)なし安全
Unityで実行開始後にtimeout適用済み。遅れて返った結果は破棄されるそのまま再実行しない

通常のtool callは30秒budgetへ近づきませんが、execute_code、長いimport、test実行では注意が必要です。hint: "retry"があっても、状態を確認してから再実行してください。

関連リファレンス