AIゲーム制作ラボ
落とし穴12分で読めます

WindowsでAIにUnityを操作させて踏んだ落とし穴14個

Unity CLI と Claude Code・Codex で実際にゲームを1本作る間に踏んだ問題を、症状・原因・対処の形で残します。PowerShell で引用符が消える、テストが0件になる、PC のスリープで打ち切りタイマーが効かない、など。

Libra

公開 2026年9月16日

この記事の要点4 points

  1. PowerShell 5.1 経由だと引数の中の引用符が落ちる。 Unity CLI に C# を渡すときは Git Bash から単一引用符で渡す。
  2. PlayMode テストは結果を待たずに「0件」で返る。 --async_tests true で走らせ、状態ファイルを読む。
  3. テスト用 asmdef が古い書き方だと、WebGL 対象のときテストが1件も実行されない。 エラーも出ないので気づきにくい。
  4. 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 で即終了

モデルの問題に見えた

気になるものから飛んでください。「痛い」は失った時間が大きかったものです。

コマンドの渡し方

01

PowerShell から渡すと、引用符が消える

症状
指定してもいないタイムアウトについて「Int32 が必要」と怒られる。
原因
PowerShell 5.1 が、外部コマンドに渡す引数の中の " を落として空白で分割する。C# の文字列リテラルが壊れ、関係のないエラーに化ける。
対処
Git Bash から、コード全体を単一引用符で囲んで渡す。
PowerShell 5.1ERROR
Error: eval の引数が無効です: --timeout には Int32 が必要ですが、
UnityEditor); var m = … が指定されました。
eval が受け取る位置指定値は 2 個ですが、3 個が指定されました
Git BashOK
$ unity command eval 'return UnityEngine.Application.unityVersion;'
6000.6.0f1
02

eval は式ではなく「文」を受け取る

症状
値を1つ返したいだけなのに ; expected でコンパイルに失敗する。
原因
渡したコードは「文」として実行される。式をそのまま置いても返り値にならない。
対処
return …; と書く。

こうすると壊れる

eval 'UnityEngine.Application.unityVersion'
→ Compilation Failed「; expected」

こうする

eval 'return UnityEngine.Application.unityVersion;'
03

エディターが2つあると、別のプロジェクトを操作してしまう

症状
意図していないほうのエディターでコマンドが実行される。
原因
2つ目のエディターは操作用のポートが 7801 になる(1つ目は 7800)。どちらがどちらかは起動順で決まるので、再起動すると入れ替わる。
対処
毎回 --project-pathUNITY_PROJECT_PATH を付ける。

テストと動作確認

04

PlayMode テストが「0件」で即座に返ってくる

痛い
症状
EditMode は結果が返るのに、PlayMode だけ Total 0 が即座に返る。
原因
PlayMode のテストは結果を待たずに返る仕様。
対処
--async_tests true で走らせ、返ってきた状態ファイルを読む。
Git BashOK
$ unity command run_tests --mode PlayMode --async_tests true
{"result":"running","StatusPath":"Temp/pipeline_test_status.json"}
05

完了判定の文字列が一致せず、終わったテストを5分待った

5分
症状
テストはとっくに終わっているのに、ポーリングが終わらない。
原因
状態ファイルは整形済みの JSON で、コロンのあとに空白が入る。空白なしの文字列を探していた。
対処
空白を許して判定する(JSON として読むのが一番確実)。

こうすると壊れる

grep '"status":"completed"'

こうする

grep -E '"status":\s*"completed"'
06

テストが5件あるのに、実行が0件(しかもエラーなし)

痛い
症状
一覧には5件出る。実行すると0件で「失敗0」。全部通ったように見える。
原因
テスト用 asmdef が古い書き方(optionalUnityReferences だけ)。ビルド対象が WebGL のとき、テスト用アセンブリが作られない。
対処
precompiledReferences に nunit、defineConstraintsUNITY_INCLUDE_TESTS を入れた新しい書き方にする。

古い書き方(WebGL で0件)

"optionalUnityReferences": ["TestAssemblies"]

新しい書き方(5件とも実行)

"overrideReferences": true,
"precompiledReferences": ["nunit.framework.dll"],
"defineConstraints": ["UNITY_INCLUDE_TESTS"]

詳しい再現条件はテストが「0件」で通る記事にまとめました。

07

画面のキャプチャ先はプロジェクトの中だけ

症状
保存先にプロジェクト外を指定すると 400 で拒否される。気づくとスクショがゲームのアセットに混ざっている。
原因
保存先はプロジェクトの中に制限され、相対パスは Assets/ からの相対になる。
対処
撮ったら消すか、保存先を .gitignore に入れる。
08

カメラのキャプチャには UI が写らない

症状
スコアなど画面に重ねた UI が消えたスクショになる。
原因
既定はカメラからの撮影で、オーバーレイの UI は入らない。
対処
--source screen を付けて Game ビューそのものを撮る。

ビルドとエディター

09

初回の WebGL ビルドは長い。「止まった」と判断しない

症状
比較で動かしていた Codex が、6分の時点で自分のビルドを強制終了した。
原因
ビルドの下請け(Bee)の出力が10秒以上止まったのを「固まった」と判断した。実際は8分33秒かかるビルドだった。
対処
AI に任せるときは「ビルドは10分程度かかる」と先に伝える。これだけで止めなくなった。
10

ビルドのたびに設定ファイルに差分が出る

症状
コードを触っていないのに、git に差分が出る。
原因
WebGL ビルドのあと、URP の設定2つと ProjectSettings.asset がエディターによって書き換えられる(シェーダーの事前絞り込みの記録など)。
対処
異常ではないと知っておく。コミットするかは中身を見て決める。
11

初回起動は利用規約の画面で止まる

症状
CLI からプロジェクトを作って開いても、unity status が「インスタンスが見つかりません」と返るだけ。
原因
エディターの初回起動で「Unity Editor Software Terms」の同意画面が出て、そこで止まっている。
対処
ここだけは人が画面で同意する。AI に全部任せる手順でも避けられない。

AI エージェント側

12

PATH にないコマンドを探すと、古い版をつかむ

4秒で終了
症状
指定したモデルが使えない、というエラーで即座に終わる。
原因
Codex の実行ファイルが PC に3つあり、アプリの更新から取り残された古い版を使っていた。
対処
--version を見て新しいほうを使う。
codex execERROR
The 'gpt-5.6-sol' model requires a newer version of Codex.
Please upgrade to the latest app or CLI and try again.
13

PC のスリープで、打ち切りタイマーごと壊れる

4時間27分
症状
60分で打ち切るつもりが、起動から4時間半たっても止まらない。
原因
Git Bash の timeout は、スリープしていた時間を数えない。実際に動いていたのは39分だった。
対処
スリープを止めてから始める。打ち切りは壁時計で見張る。
  1. 22:03

    エージェントを起動。60分で打ち切るタイマーを付けた

  2. 22:20

    WebGL ビルド開始

  3. 22:28問題

    PC がスリープ。ここからタイマーは進まない

  4. 02:16要注意

    復帰。通信が切れて再接続、ビルドは固まったまま

  5. 02:16〜要注意

    エージェントが自力で復旧を試みる(プロセスの強制終了・キャッシュを作業フォルダの外へ退避・シェル経由でエディター起動)

  6. 02:31問題

    壁時計で4時間27分が経過していたため停止。実際に動いていたのは39分

打ち切りタイマーはスリープ中の時間を数えない。時計で見ていなければ気づけなかった。

長時間走らせる前に

PC のスリープを止める(ふたを閉じない)
打ち切りの時間は、実際の時計でも見張る
Windows Update の再起動予定を確認する(この日は深夜に3回再起動していた)
作業フォルダと git のブランチを分ける
使用量の記録方法を決めておく(Codex はセッション記録の JSONL に利用枠の残りが入る)
14

自分のシェルがそのフォルダにいると、フォルダを移動できない

症状
作業フォルダを片付けようとしたら Permission denied
原因
掴んでいたのは自分自身のシェルの作業ディレクトリだった。Windows は使用中のフォルダを移動できない。
対処
ルートに戻してから実行する。AI に片付けをさせるときは「自分がそこにいないか」を先に確認させる。

おまけ:ポート 7800 は LAN から届くことがある

Unity の Pipeline は、AI から命令を受けるためのローカル HTTP API を持っています。実測すると、127.0.0.1 ではなく 0.0.0.0:7800 で待ち受けていました。

Git Bash
$ 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

出典

  1. 01Unity CLI の使い方(公式ドキュメント)Unity
  2. 02Unity Pipeline パッケージ(ローカル HTTP API)Unity

この記事は役に立ちましたか?

NEXT