【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 エディタと直接通信できます。

uloop CLI の立ち位置

ポイントは 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 がループを回せるようになることです。

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 が生成されています。

CLIから生成した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 では ObjectSystem.ObjectUnityEngine.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

ではでは!