WindowsでAIにUnityを操作させて踏んだ落とし穴14個
Unity CLI と Claude Code・Codex で実際にゲームを1本作る間に踏んだ問題を、症状・原因・対処の形で残します。PowerShell で引用符が消える、テストが0件になる、PC のスリープで打ち切りタイマーが効かない、など。
公開 2026年9月16日
この記事の要点4 points
- PowerShell 5.1 経由だと引数の中の引用符が落ちる。 Unity CLI に C# を渡すときは Git Bash から単一引用符で渡す。
- PlayMode テストは結果を待たずに「0件」で返る。 --async_tests true で走らせ、状態ファイルを読む。
- テスト用 asmdef が古い書き方だと、WebGL 対象のときテストが1件も実行されない。 エラーも出ないので気づきにくい。
- PC がスリープすると打ち切りタイマーが進まない。 放置して走らせる前に、スリープ防止と時計での監視を用意する。
目次5章
検証した環境最終確認 2026年9月16日
- Windows 11
- Unity 6.6(6000.6.0f1)
- Unity CLI 1.0.0-beta.9
- com.unity.pipeline 0.7.0-exp.1
書いてあるのは、この環境で実際に試した結果です。ツールの仕様や料金は変わるので、重要な判断の前には公式の情報も確認してください。
Unity 6.6 と AI エージェントでゲームを1本作りました。作業自体は速いのですが、時間を溶かしたのはゲームの中身ではなく環境のほうでした。
14
踏んだ落とし穴
すべて実際に起きたもの
4h27m
最大の放置
スリープでタイマーが止まった
5分
終わったテストを待った
空白1つの不一致
4秒
古い CLI で即終了
モデルの問題に見えた
気になるものから飛んでください。「痛い」は失った時間が大きかったものです。
テストと動作確認
コマンドの渡し方
PowerShell から渡すと、引用符が消える
- 症状
- 指定してもいないタイムアウトについて「Int32 が必要」と怒られる。
- 原因
- PowerShell 5.1 が、外部コマンドに渡す引数の中の
"を落として空白で分割する。C# の文字列リテラルが壊れ、関係のないエラーに化ける。 - 対処
- Git Bash から、コード全体を単一引用符で囲んで渡す。
Error: eval の引数が無効です: --timeout には Int32 が必要ですが、 UnityEditor); var m = … が指定されました。 eval が受け取る位置指定値は 2 個ですが、3 個が指定されました
$ unity command eval 'return UnityEngine.Application.unityVersion;' 6000.6.0f1
eval は式ではなく「文」を受け取る
- 症状
- 値を1つ返したいだけなのに
; expectedでコンパイルに失敗する。 - 原因
- 渡したコードは「文」として実行される。式をそのまま置いても返り値にならない。
- 対処
return …;と書く。
こうすると壊れる
eval 'UnityEngine.Application.unityVersion' → Compilation Failed「; expected」
こうする
eval 'return UnityEngine.Application.unityVersion;'
エディターが2つあると、別のプロジェクトを操作してしまう
- 症状
- 意図していないほうのエディターでコマンドが実行される。
- 原因
- 2つ目のエディターは操作用のポートが 7801 になる(1つ目は 7800)。どちらがどちらかは起動順で決まるので、再起動すると入れ替わる。
- 対処
- 毎回
--project-pathかUNITY_PROJECT_PATHを付ける。
テストと動作確認
PlayMode テストが「0件」で即座に返ってくる
痛い- 症状
- EditMode は結果が返るのに、PlayMode だけ
Total 0が即座に返る。 - 原因
- PlayMode のテストは結果を待たずに返る仕様。
- 対処
--async_tests trueで走らせ、返ってきた状態ファイルを読む。
$ unity command run_tests --mode PlayMode --async_tests true
{"result":"running","StatusPath":"Temp/pipeline_test_status.json"}完了判定の文字列が一致せず、終わったテストを5分待った
5分- 症状
- テストはとっくに終わっているのに、ポーリングが終わらない。
- 原因
- 状態ファイルは整形済みの JSON で、コロンのあとに空白が入る。空白なしの文字列を探していた。
- 対処
- 空白を許して判定する(JSON として読むのが一番確実)。
こうすると壊れる
grep '"status":"completed"'
こうする
grep -E '"status":\s*"completed"'
テストが5件あるのに、実行が0件(しかもエラーなし)
痛い- 症状
- 一覧には5件出る。実行すると0件で「失敗0」。全部通ったように見える。
- 原因
- テスト用 asmdef が古い書き方(
optionalUnityReferencesだけ)。ビルド対象が WebGL のとき、テスト用アセンブリが作られない。 - 対処
precompiledReferencesに nunit、defineConstraintsにUNITY_INCLUDE_TESTSを入れた新しい書き方にする。
古い書き方(WebGL で0件)
"optionalUnityReferences": ["TestAssemblies"]
新しい書き方(5件とも実行)
"overrideReferences": true, "precompiledReferences": ["nunit.framework.dll"], "defineConstraints": ["UNITY_INCLUDE_TESTS"]
詳しい再現条件はテストが「0件」で通る記事にまとめました。
画面のキャプチャ先はプロジェクトの中だけ
- 症状
- 保存先にプロジェクト外を指定すると 400 で拒否される。気づくとスクショがゲームのアセットに混ざっている。
- 原因
- 保存先はプロジェクトの中に制限され、相対パスは
Assets/からの相対になる。 - 対処
- 撮ったら消すか、保存先を
.gitignoreに入れる。
カメラのキャプチャには UI が写らない
- 症状
- スコアなど画面に重ねた UI が消えたスクショになる。
- 原因
- 既定はカメラからの撮影で、オーバーレイの UI は入らない。
- 対処
--source screenを付けて Game ビューそのものを撮る。
ビルドとエディター
初回の WebGL ビルドは長い。「止まった」と判断しない
- 症状
- 比較で動かしていた Codex が、6分の時点で自分のビルドを強制終了した。
- 原因
- ビルドの下請け(Bee)の出力が10秒以上止まったのを「固まった」と判断した。実際は8分33秒かかるビルドだった。
- 対処
- AI に任せるときは「ビルドは10分程度かかる」と先に伝える。これだけで止めなくなった。
ビルドのたびに設定ファイルに差分が出る
- 症状
- コードを触っていないのに、git に差分が出る。
- 原因
- WebGL ビルドのあと、URP の設定2つと
ProjectSettings.assetがエディターによって書き換えられる(シェーダーの事前絞り込みの記録など)。 - 対処
- 異常ではないと知っておく。コミットするかは中身を見て決める。
初回起動は利用規約の画面で止まる
- 症状
- CLI からプロジェクトを作って開いても、
unity statusが「インスタンスが見つかりません」と返るだけ。 - 原因
- エディターの初回起動で「Unity Editor Software Terms」の同意画面が出て、そこで止まっている。
- 対処
- ここだけは人が画面で同意する。AI に全部任せる手順でも避けられない。
AI エージェント側
PATH にないコマンドを探すと、古い版をつかむ
4秒で終了- 症状
- 指定したモデルが使えない、というエラーで即座に終わる。
- 原因
- Codex の実行ファイルが PC に3つあり、アプリの更新から取り残された古い版を使っていた。
- 対処
--versionを見て新しいほうを使う。
The 'gpt-5.6-sol' model requires a newer version of Codex. Please upgrade to the latest app or CLI and try again.
PC のスリープで、打ち切りタイマーごと壊れる
4時間27分- 症状
- 60分で打ち切るつもりが、起動から4時間半たっても止まらない。
- 原因
- Git Bash の
timeoutは、スリープしていた時間を数えない。実際に動いていたのは39分だった。 - 対処
- スリープを止めてから始める。打ち切りは壁時計で見張る。
22:03
エージェントを起動。60分で打ち切るタイマーを付けた
22:20
WebGL ビルド開始
22:28問題
PC がスリープ。ここからタイマーは進まない
02:16要注意
復帰。通信が切れて再接続、ビルドは固まったまま
02:16〜要注意
エージェントが自力で復旧を試みる(プロセスの強制終了・キャッシュを作業フォルダの外へ退避・シェル経由でエディター起動)
02:31問題
壁時計で4時間27分が経過していたため停止。実際に動いていたのは39分
長時間走らせる前に
自分のシェルがそのフォルダにいると、フォルダを移動できない
- 症状
- 作業フォルダを片付けようとしたら
Permission denied。 - 原因
- 掴んでいたのは自分自身のシェルの作業ディレクトリだった。Windows は使用中のフォルダを移動できない。
- 対処
- ルートに戻してから実行する。AI に片付けをさせるときは「自分がそこにいないか」を先に確認させる。
おまけ:ポート 7800 は LAN から届くことがある
Unity の Pipeline は、AI から命令を受けるためのローカル HTTP API を持っています。実測すると、127.0.0.1 ではなく 0.0.0.0:7800 で待ち受けていました。
$ curl http://127.0.0.1:7800/health
{"error":"Unauthorized","errorDetails":"Missing or invalid authentication token"}認証は効いていて、トークンなしはすべて 401 でした。この環境ではファイアウォールも受信を止めていました。ただしドメイン参加の PC や、許可ダイアログで Private を許可した場合は LAN から届く状態になります。 この口は任意の C# を実行できるので、共有のネットワークで作業する人は確認しておいたほうがいいと思います。
Unity 側の導入の手順と選択肢は、UnityをAIに触らせる5つの方法にまとめました。作ったゲームと、作業ごとの実測値はブロック崩しのページにあります。
FAQ
よくある質問
PlayMode テストが0件で返るのはなぜですか?
run_tests --mode PlayMode は結果を待たずに返す仕様です。--async_tests true を付けて実行し、返ってきた StatusPath(Temp/pipeline_test_status.json)を読むと結果が入っています。完了判定は「status」と値の間に空白が入る整形済み JSON なので、空白を許す形で判定してください。
テストが検出されるのに実行されないのはなぜですか?
テスト用アセンブリ定義(asmdef)が古い書き方で、nunit の参照とテスト用の定義制約が無い場合、ビルド対象が WebGL のときに現在のプラットフォーム向けのテストアセンブリが作られません。一覧には出るのに実行は0件になります。ビルド対象を Standalone に戻すと実行されます。
PowerShell からは Unity CLI を使えませんか?
使えますが、外部コマンドに渡す引数の中の二重引用符が落ちることがあります。C# のコードを渡す eval のようなコマンドでは Git Bash を使うのが確実です。
AI を長時間放置して走らせても大丈夫ですか?
スリープ対策と時間の監視を用意してからにしてください。PC がスリープするとタイマーが進まず、復帰後にエージェントがビルドの復旧を試みてプロセスを強制終了するなど、想定外の動きをすることがあります。
SOURCES
出典
この記事は役に立ちましたか?
NEXT
あわせて読む
AIにUnityのテスト・動作確認・ビルドまで回させる手順
Unity CLI の run_tests / editor_play / capture_game_view / build を使って、人が画面を触らずにテストと動作確認とWebGLビルドを回した手順を、実際のコマンドと所要時間つきで残します。
Claude CodeとCodexに同じ仕様書でブロック崩しを作らせた
同じ仕様書1枚を Claude Code(Opus 5)と Codex(GPT-5.6 Sol)に渡し、Unity 6.6 でブロック崩しを作らせて比べました。かかった時間、テストの数、詰まった場所、消えた利用枠まで、実測値をそのまま載せています。
Unityのテストが「0件」で通る:asmdefの古い書き方が原因だった
list_tests では5件見えているのに、実行すると0件。テスト用 asmdef の書き方が古く、ビルド対象が WebGL のときだけテスト用アセンブリが作られていませんでした。同じ手順で2つのプロジェクトを比べた実測と、直し方です。