【Unity×AI】uloop CLI 入門 — ターミナルから Unity エディタを操る
こんにちは、saba です。
今回は最近の Unity × AI 開発で手放せなくなったツール、uloop CLI を紹介します。 ひとことで言うと、ターミナルから Unity エディタを直接操作できる CLI です。コンパイル、テスト実行、ログ取得、スクリーンショット、そして C# コードの動的実行まで、エディタを触らずにコマンドで完結します。
そして本命はここ。ターミナルから叩けるということは——AI(Claude Code など)が Unity を運転できるということです。
この記事は、実際に Unity 6 のプロジェクトに導入して動かしながら書いています。出力はすべて手元の実物です。
概要 — uLoopMCP と uloop CLI
uLoopMCP(hatayama さん作)は「AI に Unity を運転させる」ための Unity パッケージです。もともと MCP サーバー経由で AI と Unity をつないでいましたが、その CLI 版が uloop CLI。npm で入れるコマンドラインツールで、MCP サーバーの常駐なしに Unity エディタと直接通信できます。
ポイントは Skills との組み合わせです。AI コーディングツール(Claude Code / Codex など)に「uloop の使い方」を Skills として教えておくと、「コンパイル通して」と言うだけで AI が uloop compile を叩き、エラーを読み、修正して、また叩く——という自律ループが回りはじめます。
動作環境: Unity 2022.3 以上 / Node.js 22 以上。 MCP 接続は将来メンテ終了予定とのことで、CLI + Skills が推奨構成です。
試してみる
インストール
Unity 側と CLI 側、2 つ入れます。
① Unity パッケージ(OpenUPM 経由を推奨)
Package Manager の Scoped Registry に以下を追加して、uLoopMCP をインストールします。
Name: OpenUPM
URL: https://package.openupm.com
Scope: io.github.hatayama.uloopmcp
② CLI 本体
npm install -g uloop-cli
Unity エディタ内の Settings に「Install CLI」ボタンもあるので、そちらからでも OK です。
③ AI 用の Skills(Claude Code の場合)
uloop skills install --claude
これで Claude Code が uloop の各コマンドを「知っている」状態になります。
ハマりどころ(実際に踏みました): CLI とパッケージのバージョン系列は揃えてください。
私は CLI が v2.1.5 の状態でパッケージだけ最新の 3.0.0-beta を入れてしまい、
CLI 側が設定ファイル UnityMcpSettings.json を探すのに、パッケージ側は UnityCliLoopSettings.json
を書く——という食い違いで Unity CLI Loop is not installed エラーが延々と出ました。
パッケージを CLI と同じ 2.1.5 系に合わせたら一発でつながりました。
まず叩いてみる
$ uloop --version
2.1.5
Unity プロジェクトの外で叩くと、ちゃんと怒られます。
$ uloop list
Error: Unity project not found. Use --project-path option to specify the target.
プロジェクトで Unity を起動したら、uloop sync でツール定義を取得します。実際にやると、15 個のツールが返ってきました。
$ uloop sync --project-path .
Synced 15 tools to ./.uloop/tools.json
Tools:
- clear-console
- compile
- control-play-mode
- execute-dynamic-code
- find-game-objects
- focus-window
- get-hierarchy
- get-logs
- record-input
- replay-input
- run-tests
- screenshot
...
よく使うのはこのあたりです。
# プロジェクトを適切なバージョンの Unity で起動(Unity Hub 連携)
uloop launch
# コンパイル
uloop compile
# Console ログを取得(件数・LogType・正規表現で絞り込み可)
uloop get-logs --max-count 5
# Test Runner でテスト実行(EditMode / PlayMode)
uloop run-tests --filter-type all
# EditorWindow のスクリーンショット
uloop screenshot
uloop compile の返りはこんな JSON です。AI はこれを読んで次の手を決めます。
{
"Success": true,
"ErrorCount": 0,
"WarningCount": 0,
"Errors": [],
"Warnings": []
}
複数プロジェクトを並行して開いていても、--project-path ../other-project で叩き分けられます。シェル補完も uloop completion --install で入ります。
実際のワークフローで効く場面
「エディタの操作がコマンドになった」だけなら便利ツール止まりですが、真価は AI がループを回せるようになることです。
私が実際に効くと感じた場面を 3 つ挙げます。
1. コンパイルエラーの自動修正ループ
Claude Code に「このリファクタやって。コンパイル通るまで面倒見て」と頼むと、修正 → uloop compile → エラーログを読む → また修正を勝手に繰り返してくれます。人間は最後の diff をレビューするだけ。「ビルド通った?」とエディタを覗きに行く時間がゼロになります。
2. テストの回帰チェック
変更のたびに uloop run-tests を AI に叩かせておくと、壊れた瞬間にその場で気づいて直しはじめます。EditMode / PlayMode の両対応なので、ロジックのユニットテストも挙動テストも同じループに乗ります。
3. スクショを見せて UI 調整
uloop screenshot でエディタのキャプチャを撮らせて、AI に画像ごと渡す。AI は修正 → 再スクショ → 見比べる、を繰り返せます。「見た目の調整」まで自律ループに入るのは体験として結構な衝撃でした。
共通するのは「確認作業を AI 側に渡せる」こと。人間がエディタと AI の間で伝書鳩をやる必要がなくなります。
execute-dynamic-code — 最強の万能ツール
そして今回いちばん紹介したかったのがこれ。execute-dynamic-code は任意の C# コードをエディタ上でその場実行できるツールです。
実際に、シーンに Cube を生成してみます。
uloop execute-dynamic-code --code 'using UnityEngine; \
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); \
cube.transform.position = new Vector3(0, 1, 0); \
cube.name = "SabaCube"; \
return "created: " + cube.name;'
返ってきた実物のレスポンスがこちら。Result に return 値が、SecurityLevel に実行時のセキュリティレベルが入っています。
{
"Success": true,
"Result": "created: SabaCube",
"Logs": ["Execution completed successfully"],
"CompilationErrors": [],
"SecurityLevel": "Restricted"
}
そして uloop screenshot で撮った Game ビューがこちら。ターミナルから打ったコマンドだけで、シーンに Cube が生成されています。

uloop get-hierarchy でも、ちゃんと SabaCube が階層に増えているのが確認できました。
「専用ツールが用意されていない操作」も、C# が書ければ全部できてしまう——つまり Unity API 全体が CLI の道具箱になるということです。返り値がそのまま CLI(= AI)に戻るので、調べものにも使えます。
uloop execute-dynamic-code --code 'var all = UnityEngine.Object.FindObjectsByType<UnityEngine.GameObject>(UnityEngine.FindObjectsSortMode.None); \
var lights = UnityEngine.Object.FindObjectsByType<UnityEngine.Light>(UnityEngine.FindObjectsSortMode.None); \
return $"GameObjects: {all.Length}, Lights: {lights.Length}";'
{ "Success": true, "Result": "GameObjects: 4, Lights: 1" }
AI との組み合わせでは、これが実質「Unity エディタの拡張をその場で書いて、その場で使い捨てる」体験になります。エディタ拡張のためにメニュー項目を生やしてコンパイルを待つ——あの往復がなくなるんです。
ちょっとした注意: 動的コードのデフォルト using では Object が System.Object と UnityEngine.Object で衝突(CS0104)することがあります。上のように UnityEngine.Object と完全修飾すると安全です。
セキュリティ — 危険な API は実際に止まる
なんでもできる = 危ないので、セキュリティレベルの設定があります。試しに、ファイル書き込み(危険 API)を Restricted のまま実行してみると——
uloop execute-dynamic-code --code 'System.IO.File.WriteAllText("/tmp/x.txt", "x"); return "wrote";'
{
"Success": false,
"SecurityLevel": "Restricted",
"ErrorMessage": "Security violations detected DangerousApiCall: Dangerous API detected: File.WriteAllText"
}
このとおり、File.WriteAllText が「危険 API」として実際にブロックされました。
- Level 1: Restricted(推奨) — Unity API の基本機能に限定。ファイル削除・ネットワーク・プロセス実行などをブロック
- Level 2: FullAccess — 全 API 解放(リスク高)
チームで使うなら Restricted 運用が無難です。
まとめ
- uloop CLI = ターミナルから Unity を操作する道具。Skills を入れると AI がそのまま運転手になる
- コンパイル・テスト・ログ・スクショが自律ループに乗ると、人間の仕事はレビューに寄る
execute-dynamic-codeがあれば、専用ツールにない操作も C# で全部書ける(危険 API はちゃんと止まる)- 導入時は CLI とパッケージのバージョン系列を揃えるのだけ注意
「AI に Unity を触らせる」はまだ発展途上の領域ですが、uloop CLI は導入が軽く(npm 一発 + パッケージ 1 個)、効果がすぐ体感できるツールでした。実際、この記事を書くために動かしただけでも「これは日常のループが変わるな」と感じています。Unity × AI に興味がある人は、まず uloop compile のループから試してみてください。
リンク: GitHub - hatayama/unity-cli-loop
ではでは!
