前回の記事では、Unity CLIを使ってEditorのインストールやプロジェクトを開く操作をターミナルから行う方法を紹介しました。

Unity CLIには、起動中のUnity Editorにつないで、シーンの中身を直接操作する機能もあります。

今回はこの機能を使い、ターミナルからキューブを配置したあと、同じ作業をClaude Codeにお願いするところまでを試します。

Unity CLIでEditorを操作するとは?

Unity CLIは、起動中のUnity Editorと通信して、GameObjectの作成やシーンの保存、C#コードの実行などを行えます。

この通信を受け持つのが、プロジェクトに追加するPipelineパッケージ(com.unity.pipeline)です。

Pipelineパッケージを入れたEditorはローカルでサーバーを立ち上げ、CLIからのコマンドを受け付けます。

すでに起動しているEditorに対して命令を送るので、batchmodeのように毎回Editorを立ち上げ直す必要はありません。

Unity CLIに同梱されているスキルの説明では、起動済みのEditorへの命令はおよそ200〜600ミリ秒で返ってくるとされています。

なお、AIからUnityを操作する方法としてはUnityMCPもあります。

UnityMCPはMCPサーバーを介してAIクライアントにUnity操作用のツールを渡す仕組みです。

今回紹介する方法は、AIにターミナルでunityコマンドを打ってもらう形になります。

使用するバージョン

本記事では次の環境で動作を確認しています。

  • Unity 6000.4.10f1
  • Unity CLI 1.0.0-beta.11
  • Pipelineパッケージ 0.8.0-exp.1
  • macOS

Unity CLIはベータ版(experimental)、Pipelineパッケージはexperimental版です。

コマンドやパラメーターは今後変わる可能性があるため、実際に試すときは--helpや公式ドキュメントで最新の状態を確認してください。

Unity Editorとの接続

Editorに接続するには、対象のプロジェクトにPipelineパッケージを追加します。

PipelineパッケージはUnity 6.0以降に対応しています。

パッケージの追加は、Unity CLIのunity pipeline installコマンドで行えます。

# プロジェクトに Pipeline パッケージを追加する
unity pipeline install --project-path /path/to/MyProject

このコマンドは、UnityのパッケージレジストリからPipelineパッケージを取得し、プロジェクトのPackages/manifest.jsonに追記します。

プロジェクトのフォルダ内でコマンドを実行する場合は、--project-pathを省略しても自動で対象のプロジェクトが選ばれます。

追加したら、Unity Editorでプロジェクトを開きます。すでに開いている場合は、Editorに戻るとパッケージのインポートが始まります。

接続できているかの確認

unity statusで状態がreadyになっていれば、CLIからEditorに接続できています。

確認にはunity statusコマンドを使います。

unity status

接続できているEditorがあると、次のように一覧で表示されます。

ポート	状態	プロジェクト	バージョン	PID
7800	ready	/Users/xxx/MyProject	6000.4.10f1	22054

状態がreadyになっていれば、コマンドを受け付けられる状態です。

Pipelineパッケージの状態まで確認したい場合は、unity pipeline listを使います。

unity pipeline list

このコマンドでは、パッケージのバージョンやサーバーに到達できるかどうか、セーフモードになっていないかなどを確認できます。

つながらないときは

unity statusに何も表示されないときは、まずプロジェクトにコンパイルエラーがないかを確認してください。

プロジェクトを開く時点でC#のコンパイルエラーがあると、Editorはセーフモードで起動し、Pipelineパッケージが読み込まれません。 この状態ではCLIから接続できないため、エラーを直してからEditorを再起動します。 セーフモードになっているかどうかは、unity pipeline listの「セーフモード」の列で確認できます。

また、複数のEditorを同時に開いている場合は、どのEditorに命令を送るかを--project-pathで指定します。

unity command editor_status --project-path /path/to/MyProject

指定しない場合は、ターミナルのカレントディレクトリを含むプロジェクトが対象になります。

ターミナルからCLIで操作する

接続できたら、実際にEditorを操作してみます。

Editorが受け付けるコマンドの一覧は、unity commandを引数なしで実行すると表示されます。

unity command

create_gameobjectやsave_scene、editor_playなど、多くのコマンドが用意されています。

一覧は長いので、--queryで絞り込むと目的のコマンドを探しやすくなります。

# 名前や説明に gameobject を含むコマンドだけ表示する
unity command --query gameobject --detail compact

キューブを1つ置く

まずはシーンにキューブを1つ置いてみます。

create_gameobjectコマンドに、プリミティブの種類と名前を渡します。

unity command create_gameobject --primitive cube --name MyCube

実行すると、EditorのアクティブなシーンにMyCubeが追加されます。

キューブを10×10に並べる

次は、キューブを10×10のグリッド状に並べてみます。

unity command evalを使うと、C#のコードをEditor上でそのまま実行できます。

unity command eval '
// 親オブジェクトを作る
var parent = new UnityEngine.GameObject("Cubes");
// 10×10のグリッドでキューブを生成する
for (var x = 0; x < 10; x++)
{
    for (var z = 0; z < 10; z++)
    {
        var cube = UnityEngine.GameObject.CreatePrimitive(UnityEngine.PrimitiveType.Cube);
        cube.name = $"Cube_{x}_{z}";
        cube.transform.SetParent(parent.transform);
        // 1.5間隔で並べる
        cube.transform.position = new UnityEngine.Vector3(x * 1.5f, 0f, z * 1.5f);
    }
}
return "done";
'

なお、ここではmacOSのシェル(zsh)を想定してシングルクォートで囲んでいます。WindowsのPowerShellでは、クォートの書き方が異なります。

一応これで並べられますが、書くのはなかなか大変です。

UnityEngine.GameObjectのように型名を名前空間から書いているうえ、シェルのクォートの中にC#を書くので、文字列に'を使いたくなるとエスケープも必要になります。

create_gameobjectsのようにまとめて作るコマンドもありますが、100個分の座標を[x,y,z]の配列で渡す必要があり、手で書くのは現実的ではありません。

さらに、コマンドやパラメーターの名前はEditor側で定義されているため、使うたびに一覧やヘルプで確認することになります。

ちょっと配置を試したいだけなのに、毎回これを書くのは手間ですよね。

Claude Codeにお願いする

そこで、この作業をClaude Codeにお願いしてみます。

コマンドの調べ方、パラメーターの組み立て、C#コードの記述といった面倒な部分を任せられるので、こちらは「何をしたいか」を伝えるだけで済みます。

Unity CLIのスキルをインストールする

Claude Codeがunityコマンドを正しく使えるように、Unity CLIのスキルをインストールします。

スキルはUnity CLIに同梱されているので、次のコマンドで追加できます。

# Claude Code 向けにスキルをインストールする
unity skill install claude-code

プロジェクトのフォルダ内で--localを付けて実行すると、プロジェクト単位でインストールされます。

この場合、Pipelineパッケージに含まれるunity-pipelineスキルも一緒にコピーされます。

# プロジェクトのフォルダ内でインストールする
unity skill install claude-code --local

claude-codeの部分を変えれば、Cursor(cursor)やCodex CLI(codex)、GitHub Copilot(vscode)など、ほかのツールにもインストールできます。

対応しているツールはunity skill install --listで確認できます。

# スキルをインストールできるツールの一覧を表示する
unity skill install --list

Unity CLIをunity self-updateで更新したあとは、unity skill refreshでスキルも最新の内容に更新しておきましょう。

Claude Codeの動き

スキルには、Unityを操作するときの手順が書かれています。

スキルを入れた状態でClaude CodeにUnityの操作をお願いすると、おおむね次のような流れで作業します。

  1. unity statusで接続中のEditorを確認する
  2. unity commandでEditorが受け付けるコマンドを調べる
  3. 目的に合ったコマンドやevalを組み立てて実行する
  4. 結果を確認して報告する

Editorによって使えるコマンドが違うこともあるので、コマンド名を決め打ちせず、毎回一覧から探してくれます。

また、スキルでは、Editorが起動しているときはシーンファイル(.unity)のYAMLを直接書き換えず、Editorに命令を送るよう指示されています。

そのため、変更はすぐEditorに反映されます。

実践:たくさんのキューブを配置する

先ほどターミナルで行った10×10の配置を、Claude Codeに頼んでみます。

Unityのシーンに、キューブを10×10のグリッドで並べて。
間隔は1.5で、Cubesという親オブジェクトの下にまとめてほしい。

Claude Codeが接続を確認し、キューブを生成するコマンドを組み立てて実行します。

ターミナルで書いた長いコマンドが、日本語の一文で済みます。

アレンジしてみる

続けて、並べたキューブに変化をつけてみます。

並べたキューブの高さを、中心から離れるほど高くして。
あと、色を位置に応じてグラデーションにしてほしい。

前の結果をふまえて、追加の指示をそのまま出せます。

最後に、シーンの保存もお願いしておきましょう。

シーンを保存して。

使うときの注意

Unity CLIとPipelineパッケージはどちらも正式リリース前の段階です。

コマンド名やパラメーターは今後変わる可能性があります。

本記事のコマンドがそのまま動かないときは、unity commandの一覧や--helpで確認してください。

また、Claude Codeは起動中のEditorを直接操作します。

意図しない変更が入る可能性もあるため、作業前にシーンを保存するか、バージョン管理でコミットしておくと安心です。

削除など影響の大きいコマンドは、実行前に内容を確認してから許可するようにしましょう。

まとめ

今回は、Unity CLIを起動中のUnity Editorに接続し、ターミナルやClaude Codeから操作する方法を紹介しました。

Pipelineパッケージを入れるだけで、CLIからGameObjectの作成やC#コードの実行ができるようになります。

ターミナルから直接操作することもできますが、コマンドやコードを自分で組み立てるのは手間がかかります。

Claude Codeにお願いすれば、やりたいことを日本語で伝えるだけで済みます。

今回はClaude Codeを使いましたが、やっていることはターミナルからunityコマンドを呼び出すだけです。

コマンドを実行できるLLMのツールであれば、同じようにUnityを操作できるはずです。

まずはキューブを並べるような簡単な作業から、お使いのLLMに頼んでみてください。