Unity MCP をざっくり使ってみてのはまりポイントについて羅列
同名のパッケージがいくつかあるようだが、今回使ったのは(自分が把握してる限り)かなり初期に公開されて機能も豊富な以下パッケージ
https://github.com/justinpbarnett/unity-mcp
unity-mcp の仕組み
トラブルシューティングしたりデフォルト以外の MCP Client を使うために中身を理解しておいた方が良い
意外とよくある MCP Server 実装じゃない点に注意
登場人物
- MCP Client: エンドユーザーが使用するアプリケーション
- MCP Server (Python): FastMCPフレームワークを使用したPythonサーバー
- UnityConnection: MCP ServerとUnity Editor間の通信を担当するコンポーネント
- UnityMcpBridge: Unity Editor内で動作するTCPサーバー
各要素間のやり取りのイメージ図
いわゆる MCP でやり取りされてるのは python と MCP Client の間だけ
Python の裏は別途 TCP で Unity Editor と接続している(する必要がある)
開発時は、ユーザーからみて Unity Editor と MCP Client 両方見るケースが多い点が混乱の元なので注意が必要。
以下のようなリモート処理(テストとかで使えそう)だともう少し理解しやすいが、MCP Client から python server までのプロトコルに url が使えるかどうかは未調査
サーバーサイドで unity-mcp を使いたい場合に取れる構成のイメージ(未検証)
サーバーサイドで実行するならヘッドレスだと思うのでこのような構成になると思われる。
プロジェクトコードを同時にみないので構成としてはこっちの方がわかりやすい
プロンプトで詰まったところ
コンテキストオーバーフロー
雑にディレクトリ読ませると、大量のファイルを読み取ってきてモデルの input context をオーバーしてしまった。これはコスト観点でも非常によくないので、system prompt で安易な list(一覧表示) を禁止して、なるべくディレクトリの階層を限定する指示を出した
ファイルシステムの利用禁止
ファイルシステム側で新規作成、コピーなどをした時に Unity 側のGUID の参照が崩れる懸念があったため、基本的には MCP 経由でアセット操作するよう強制した
リフレッシュが必要な点
MCP 経由でアセットを更新した際、そのまま次の操作を実行するとアセット操作を反映していない結果を得てしまい、同じ操作を繰り返してしまった。おそらくアセット変更は即時反映されない仕様っぽい。
同 MCP にリフレッシュに関する tool もあったため、アセット操作後はリフレッシュを必須とすることをプロンプトで指示することで改善した
TBD
他にも見つかれば追記します
免責
これは実際に触ってみたメモに近いため正確性の担保が弱い点、また MCP は変化が激しいので時間の経過により変わりうる点は注意してください。