Open10

UnityMCPを使ってみる

HidanoHidano

私の尊敬するエンジニアの一人であるいすず氏がUnity向けMCPフレームワークをリリースしていたので、早速使ってみようのコーナーです。
https://x.com/Shiranui_Isuzu_/status/1912384274801795355

なお筆者はUnityとの鍔迫り合いを生業としていますが、MCPやTypeScriptはまだ触れたことが無かったので、少し詳しめの導入に出来たらと思っています。
既にMCPを使い倒している方には退屈な内容となるので、本家GitHubのREADMEにジャンプされることを推奨します。

HidanoHidano

まずはREADMEに従ってUnityで適当なプロジェクトを用意し、PackageManagerからUnityMCPのパッケージをインポートします。
ここで躓く場合はUnity公式のドキュメントを確認しましょう。SourceTreeやForkなどに内蔵のgitはあるけど、OS自体にGitが入っていないとかはあるあるです。

Preferencesで設定を確認します。
基本的には初期設定で問題なさそうですが、便利そうだったのでAuto-start on Launchにチェックを入れています。
稀にPortが別のアプリと被ることがあるので、上手く通信できない人はここを疑ってみるとよいかもしれません。

HidanoHidano

本家GitHubのReleaseページからunity-mcp-build.zipをDLし、解凍します。
複数のファイルやフォルダが展開されるので、事前に新規フォルダを作り、その中で解凍するのがよいでしょう。
私は解凍ツールに7zipを使っているので、メニューからこのような項目を選択することで、新規フォルダ作成も一緒にやってくれて便利です。
ちなみにWindows11は右クリックメニューに7zipなどの追加項目を出さない忌まわしき仕様がありますが、これはレジストリキーを編集することでWin10以前の表示に戻せます。気になる方はググってみてください。

解凍したファイル内のIndex.jsのパスを取得します。
丁寧にアドレスバーやプロパティから入手したフォルダ名にファイル名を追記してもよいですが、Shiftキーを押しながら右クリックすることで、「パスのコピー」という項目が出るので、こちらの方が早いです。
このスクショは以前のバージョンの状態なので、現在はもう少し中身が減って分かりやすくなっているはずです。

このパスは次の工程までしばらく使わないので、メモ帳などに控えておきましょう。

お使いのPCにnpmが入っていない方は、公式ページからインストールを行ってください。
筆者は既に使っているので、この工程はスルーします。
https://nodejs.org/ja

HidanoHidano

次にClaudeDesktopをインストールします。インストーラをDLして実行すると、何も確認することなく直ちにインストールが完了して使えるようになります。こういうのって法的にオッケーなんですかね。
ちなみにアンインストールも爆速で、一切引き留めもせずに疾く消え去ります。潔いですね。再度インストールすると既にログインされた状態で立ち上がります。こいつPCを汚してますね。
ともあれインストールしたらログインと認証を行い、左上のハンバーガーメニューからファイル>設定を開きます。

「一般」と「開発者」のタブがあるので、「開発者」を選択するとMCPの設定画面が開きます。

「構成を編集」を選択するとclaude_desktop_config.jsonファイルの場所が開くので、フォーカスされたJSONファイルをテキストエディタで開きます。

最初は中括弧{}があるだけなので、GitHubのREADMEに従って、先ほどコピーしたindex.jsファイルのパスを入力します。
Windowsの場合、パスに含まれるバックスラッシュ(もしくは¥マーク)がJSONで正しく解釈されないので、バックスラッシュ2連続にするか、普通のスラッシュ「/」に書き換えましょう。
私の場合はバックスラッシュ2連続にしてこのようになりました。

{
  "mcpServers": {
    "unity-mcp": {
      "command": "node",
      "args": [
        "C:\\Private\\AI\\UnityMCP\\index.js"
      ]
    }
  }
}

設定を変更したらアプリを再起動するのですが、普通に×ボタンを押すだけだとバックグラウンドで生き残っていますので、ファイルメニューから終了を選ぶか、タスクトレイから終了させて確実に息の根を止めましょう。

再度起動して設定を開き、開発者画面にunity-mcpが表示されていればClaudeDesktop側の準備は完了です。

HidanoHidano

ここまででClaudeとUnityがMCPで通信できるようになったのですが、初期状態で実行できるコマンドは、Unityのメニューバーを操作するmenu_executeだけのようです。
ここに自前のコマンドを色々追加できるのがこのツールの醍醐味と認識していますが、公式サンプルを追加するだけでかなりの作業が出来るようになるので、まずはそちらを設定してみましょう。
PackageManagerに2種類のSampleデータがあるので、両方インポートします。

PackageManagerのUIはUnityのバージョンによって大きく変わるので、Unity6でない場合はスクショと一致しません。探しましょう。

Unity側のサンプルスクリプトはそのままで問題ありませんが、JavaScriptのサンプルとして追加されるjsファイルは、先にZipで持ってきたフォルダの中の、handlersフォルダに移す必要があります。

ハイライトした2点が、PackageManagerのJavaScriptSampleで追加されたjsファイル

移し終えたら忘れずにClaudeDesktopを再起動しましょう。
ClaudeDesktopがコマンドを認識するとチャットボックスに金槌ボタンが表示され、他にMCPの連携を行っていなければ5個のコマンドが表示されるはずです。

これでUnity側に実行するコマンドを定義できた形ですが、私の環境ではTimelineパッケージを入れていなかったため、Unity側でエラーとなりました。 v0.2.0で修正されました。

HidanoHidano

あとはClaudeDesktopから実行したい作業を自然言語で入力すると、UnityEditorと通信してSceneを編集したり、スクリプトを作成してアタッチしてくれたりします。
ちょいちょいUnity側のMCPサーバーからエラーが返ってきてClaude君から手動で操作するよう要求されますが、「いやお前の書き方が違うからやり直せ」と優しく送り返してあげると正しく動作したりします。

途中でエラーログを調べるため一度キャプチャを止めたので、厳密にノンストップで作り上げられた物ではない旨ご了承ください。

そうして無から生み出されたデモがこちら。

お、おう

HidanoHidano

内容はともかく、UnityEditorに指一本触れることなくParticleSystemを使ったデモコンテンツを作ることが出来ました。
そういえばスクリプトを1枚も作ってないですが、本稿執筆に際して行った予備実験では生成していたので、単に今回は不要と判断したのでしょう。技術的には可能です。

今回あくまでデモとしてClaude3.7Sonnetくんに一発芸的に作ってもらいましたが、AIの活かし方として、抽象度の高い要求にワンストップで答えさせるのは得策でなく、細分化したタスクをショットで処理させるべきと言うのがここ数年で培われた定石です。
パッと思いつく使い方としては、プロジェクトに追加されたキャラクターモデルにテスト用のモーションを流し込んでUnityRecorderでキャプチャするとか、既に大量に作ってしまったキャラクターのパラメータ設定ファイル(ScriptableObject)を一括で編集するとかでしょうか。
その気になれば自力でコード書いて自動化できる作業を、サクッとラフに試してみて、良い感じだったらEditorスクリプトに出力してもらうみたいな使い方が効果的かもしれません。

今後の展望としては、まず他のMCPを使うサービスと連携させてみたいですね。
現状Unityの中からしかコマンド実行できないので、手が伸ばせる範囲が基本的にAssetsフォルダの中に限られてしまいます。
とりあえずOSのファイルシステムが扱えるMCPサーバーと連携すれば、manifest.jsonを直接編集してプロジェクトの構成を整えたり、AppData以下にあるEditorのログファイルを参照してより高精度なトラブルシューティングも出来そうです。
コード生成も、おそらくClaudeDesktopからのコマンドで作成するよりも、MCPに対応したコードエディタで生成した方がよい気がします。
今だとやっぱりVSCodeなんですかね…最近Microsoftが猛プッシュしてますし。でもビッグテックの独占状態はロクなことにならないので、CursorやRiderにも頑張ってほしさはあります。

あとはカスタムコマンドも技術的興味はありますが、既に今あるサンプルコード分だけでかなりのタスクが出来てしまうので、どんなコマンドが需要あるんでしょうね。AnimationClipの編集とか?

HidanoHidano

本稿を公開したところ、さっそく作者様の方で不具合修正をしていただけたので、更新方法も示しておきます。
GitでUnityにインポートしているパッケージはPackageManager上に更新マークが出ないので、手動でUpdateボタンを押して更新しましょう。

Samplesも更新されているので、それぞれUpdateします。

前のバージョンのデータが消えてしまうが問題ないかと訊かれます。心配な方はバックアップを取りましょう。

プロジェクトのmanifest.jsonでパッケージのバージョンを指定することも出来るので、旧バージョンが消えることを極端に恐れる必要はないです(参考)。

Releseのunity-mcp-build.zipも更新されているので、内容を差し替えておきましょう。
パスに変更が無ければClaudeDesktopの設定はそのままで大丈夫です。既に起動している場合は再起動をお忘れなく。

yochamnyochamn

ありがとうございます。大変参考になりました。
うちはblenderと共用してるので
{
"mcpServers": {
"blender": {
"command": "uvx",
"args": [ "blender-mcp" ]
},
"unity-mcp": {
"command": "node",
"args": [
"C:/mcpserver/unity-mcp-build/index.js"
]
}
}
}  でイケました。
JSONでは、オブジェクト内の各キーはカンマで区切る必要があります
Windowsのパス指定では、バックスラッシュを2つ重ねる(\)か、フォワードスラッシュ(/)を使用する必要があります。単一のバックスラッシュはJSONでエスケープ文字として扱われるためです。
上記の設定をclaude_desktop_config.jsonファイルに保存することで、blenderとunity-mcpの両方のサーバー設定が有効になります・・・なのですが、¥¥では上手くいかず、代替案のフォワードスラッシュ(/)でやりました。気持ち悪いですが、動いているのでヨシ。