はじめに
Meta XR Operator は、AI エージェントから実行中の VR/MR アプリを操作・テストできる実験的な機能です。この記事では、Meta XR Operator を Unity と Claude Code から実際に使うためのセットアップ方法と、つまずきやすいポイントを紹介します。
Meta XR Operator の特徴は、AI が Unity のコードそのものを操作するのではなく、実行中の VR/MR アプリを OpenXR のレベルで直接観察・操作できることです。具体的には、次のような仕組みになっています。
- 実体は OpenXR の API レイヤー(
XR_APILAYER_METAX_operator)と、そこにつながる MCP(Model Context Protocol)サーバー - Claude Code などの MCP 対応エージェントから、頭やコントローラーの姿勢の取得・設定、ボタン入力の注入、合成後の映像のキャプチャなどができる
- アプリ側の C# コードは一切書き換えない(ランタイムと Unity の間に割り込むだけ)
「ヘッドセットを被らずに、AI にアプリを歩き回らせてテストさせる」という開発フローが視野に入る機能です。
この記事では、Windows + Unity 6 の環境で、インストールから「頭の姿勢を取ってスクリーンショットを撮る」ところまでを、実際にハマった点を含めて紹介します。
2026/9/25追記:Meta XR SDK v207について
この記事は、Meta XR Operatorが初めて公開された Meta XR Core SDK v205 を使用して検証した内容です。
その後Meta XR SDKは v207 にアップデートされ、Meta XR Operatorの公式ドキュメントも更新されています。
現在の公式ドキュメントでは、Meta XR Operatorの利用要件は以下となっています。
- Unity 6000.0.x 以降
- Meta XR Core SDK v207以降
- OpenXR Plugin 1.17.0以降
- MCPに対応したAIコーディングエージェント
Hand Trackingへの対応
v205公開時のMeta公式ブログでは、Hand Trackingについて
Your agent currently uses a single aim-ray per hand with no per-finger data, so hand-first interactions are not yet supported.
とされており、AIエージェントから手を使った操作を行うことには制限がありました。
現在のv207向け公式ドキュメントでは、Meta XR Operatorから以下の操作が可能であると記載されています。
- Hand Poseの移動
- Pinch
- Poke
- Grab
- Hand Stateの取得
- Gaze and Pinch
そのため、v205では主にHead PoseとTouch Controllerを使った操作が中心でしたが、v207では手や視線を使ったインタラクションもAIエージェントからテストできるようになっています。
特に、Hand Trackingを前提としたVR/MRアプリのUIテストをAIエージェントに行わせられるようになったのは、大きな変化だと思います。
Meta XR Simulator v207
Meta XR Simulatorもv207にアップデートされ、以下のような機能が追加されています。
- Look and Pinch入力
- Webカメラを利用したHand Tracking
- 指ごとのPinch Strength
- Meta VR Glassesのシミュレーション
- Session Video Recording
- Meta VR CLIを利用したAI AgentからのHeadless実行
Meta XR OperatorとMeta XR Simulatorを組み合わせることで、ヘッドセットを装着せずに
Claude Code → Meta XR Operator → Meta XR Simulator → Unityアプリ
という形で、AIエージェントによる操作・確認・テストを行える範囲がv205より広がっています。
セットアップ方法について
セットアップ方法も整理されており、現在はUnityの
Window > Meta > Meta XR SDK > AI Tools
から、Meta VR CLIやXR Operatorのインストール、MCP対応AIエージェントへの登録、XR OperatorのActivateなどを行えるようになっています。
また、Project Setup Tool からMeta XR Operator関連の推奨設定を適用すると、OpenXR Pluginの確認、API Layersの有効化、Meta XR Operator Layerの登録なども行われます。
この記事の以下の本文については、v205リリース時に実際にセットアップ・検証した記録として、そのまま残しています。
特にAPI Layerの設定やClaude Codeとの接続で発生した問題については、v205当時の挙動になります。v207ではセットアップフローが改善されているため、これから試す場合は上記の最新公式ドキュメントも合わせて確認することをおすすめします。
[!NOTE]
Meta XR Operatorは現在もExperimental(実験的機能)です。Meta公式でも、Tool名・API・挙動は今後変更される可能性があるとされています。
検証環境
| 項目 | バージョン |
|---|---|
| OS | Windows 11 Pro |
| Unity | 6000.3.21f1(Unity 6.3) |
| Meta XR Core SDK | 205.0.0 |
| Meta XR Simulator | 205.0(スタンドアロン版) |
| OpenXR Plugin(com.unity.xr.openxr) | 1.17.1 |
| XR Interaction Toolkit | 3.3.2 |
| AI エージェント | Claude Code |
| Unity Editor の操作 | Unity CLI Loop(Play Mode の開始・停止、Editor 内での C# 実行、スクリーンショット) |
Unity CLI Loop は、Claude Code から Unity Editor を操作するための CLI です。導入方法は以前に書いた記事 Claude Code から Unity を操作する Unity CLI Loop の導入 を参照してください。この記事では導入済みの前提で進めます。
公式の必須要件は「Unity 6 以降、Meta XR Core SDK v205 以降、OpenXR Plugin 1.17.0 以降」です。
OpenXR Plugin 1.17 で追加された「API Layers」機能を使うため、これより古い OpenXR Plugin では動きません。
全体構成
先に構成を把握しておくと、後のトラブルシューティングが楽になります。
ポイントは 3 つあります。
- Operator 本体(ポート 8720)は XR セッションが動いている間だけ存在します。 Play Mode に入っていないと、MCP ツールは「Server unavailable」を返します。プロキシはツール一覧をキャッシュして返すので、ツール自体は見えますが実行はできません。
- Operator が触れるのは実行中の XR 空間だけです。 Play Mode に入る、Editor 内で C# を実行して状態を確認する、Game view を撮るといった Editor 側の操作は、この記事では Unity CLI Loop が担当しています。「Editor 側は Unity CLI Loop、実行中の VR 空間は Meta XR Operator」という役割分担です。
- Meta XR Core SDK も別に Unity Editor 側の MCP ブリッジ(ポート 48736)を立てます。シーン階層の取得やコンパイル、テスト実行などのツールがあり、Editor 側の操作はこちらでも代替できる可能性がありますが、今回は使っていません(未検証)。
インストール手順
1. Meta XR Core SDK v205 を入れる
Package Manager から com.meta.xr.sdk.core の 205.0.0 を導入します。OpenXR Plugin 1.17 以降も入れておきます。
2. Meta XR Simulator(スタンドアロン版)を入れる
ここが最初のハマりどころでした。
v205 の Meta XR Simulator は Unity パッケージではなく、PC にインストールする単体アプリです(旧 com.meta.xr.simulator パッケージは廃止扱い)。
Core SDK を入れただけの状態で Meta > Meta XR Simulator メニューを開くと、Activate がグレーアウトして押せません。
Core SDK のコードを追うと、Activate の有効条件は「Simulator 本体がインストール済みか」で、その判定は Windows のレジストリに xrsim:// プロトコルハンドラ(HKCU\Software\Classes\xrsim\shell\open\command)が登録されているかどうかで行っています。つまり本体を入れない限り押せません。
手順は次のとおりです。
- Meta 開発者サイトの Meta XR Simulator(Windows) から MSI をダウンロードしてインストールする(Core SDK と同じバージョン 205 を選ぶ)
- Unity を再起動する
-
Meta > Meta XR Simulator > StatusでInstalled: Yesを確認する -
Meta > Meta XR Simulator > Activateを実行する(Console にMeta XR Simulator is activatedが出れば成功)
Activate の中身は、環境変数 XR_RUNTIME_JSON をインストール先の meta_openxr_simulator.json に切り替える処理です。
この環境変数は Unity プロセス単位で設定されるので、Unity を再起動するたびに Activate し直す必要があります。 これも地味にハマりました。
3. Meta XR Operator を Activate する
Meta > AI Tools ウィンドウ(または Meta > Meta XR Operator > Activate)から Operator を有効化します。
このとき次のことが行われます。
- MCP プロキシ
meta-xr-operator-mcp-proxy.exeを%USERPROFILE%\meta-xr-operator\に配置 - Claude Code の設定に MCP サーバー 2 つ(
meta-xr-operatorとmeta-xr-unity-runtime)をプロジェクト単位で登録 - プロジェクトの
.claude/skills/に Operator 用の skill を 8 個配置(使い方、座標変換、Grab/Poke 操作、テスト手順など)
Claude Code 側は claude mcp list で 2 つとも Connected になっていれば OK です。
MCP の登録は Claude Code のセッション起動時に読まれるので、登録後は Claude Code を起動し直してください。
4. (ハマりどころ)OpenXR 設定に API レイヤーが登録されているか確認する
私の環境では、Operator を Activate してもポート 8720 が開かず、ツールが全部「Server unavailable」でした。
原因は、Activate の EditorPrefs フラグは立っているのに、OpenXR 設定(Standalone)の「API Layers」機能が無効のままで、Operator のレイヤーも未登録だったことです。
Activate 処理は本来この登録も行うのですが、何らかの理由で反映されていませんでした。
確認と修正は以下です。
-
Project Settings > XR Plug-in Management > OpenXR > Windows タブで API Layers を有効にする - API Layers に
Packages/com.meta.xr.sdk.core/Editor/MetaXROperator/x64/XrApiLayer_METAX_operator.jsonを登録して有効にする -
Meta > Tools > Project Setup Toolにも「Meta XR Operator requires the API Layers feature…」「API layer is not registered」というルールがあるので、そこの Fix ボタンでも直せます
Play Mode に入って、次のコマンドでポート 8720 が LISTENING になっていれば Operator が起動しています。
netstat -ano | findstr 8720
使ってみる
頭の姿勢を取る
Play Mode に入った状態で、Claude Code に「ヘッドの位置を取得して」と頼むと、openxr_get_head_pose が呼ばれます。
{
"pose": {
"position": [0.0, 1.7, 0.0],
"orientation": [0.0, 0.0, 0.0, 1.0]
},
"flags": {
"position_valid": true,
"orientation_valid": true,
"position_tracked": true,
"orientation_tracked": true
}
}
基準空間は既定で local_floor(床原点)です。Simulator の初期姿勢は「床の真上、高さ 1.7 m、正面向き」でした。
座標系は OpenXR(右手系、-Z が前)なので、Unity の座標(左手系、+Z が前)とは変換が必要です。変換用のツール convert_openxr_pose_to_unity / convert_unity_pose_to_openxr も用意されています。
スクリーンショットを撮る
Claude Code に「今見えている画面のスクリーンショットを撮って」と頼むと、openxr_capture_composited_image が呼ばれます。
返ってくるのはコンポジター出力(ユーザーが実際に見ている映像)で、パススルーが有効ならそれも合成された状態です。
私の場合、体験開始前の注意事項パネルがそのまま写り、Claude Code は「黒背景に注意事項パネルが表示され、6 項目の注意書きとボタン枠が 1 つ見えています」と内容を説明してきました。「見えているものをそのまま AI に見せられる」のが強みです。
頭を動かす
「頭を 50 度くらい下に向けて、足元を見て」と頼むと、Claude Code がクォータニオンを計算して openxr_set_head_pose を呼びます。
このとき渡していたのは X 軸まわり -50 度の回転です。
{ "orientation": [-0.4226, 0, 0, 0.9063] }
「足元を見て」と頼んだあとに「もう一度スクリーンショットを撮って」と続けると、床が写った画像が返ってきて、頭が動いたことを画像で確認できます。
「3 秒かけてゆっくり右を向いて」のように時間を含めて頼むと duration_seconds 付きで呼ばれ、補間しながら滑らかに動きます。「歩きながら境界に近づいたときの演出」のような、時間経過を伴うテストに使えます。
コントローラーを出す
Simulator にコントローラーが何もつながっていない状態で「右手のコントローラーの位置を教えて」と頼むと、openxr_get_controller_pose が呼ばれ、「右コントローラーは非アクティブでトラッキングされていません」という答えが返ってきます(is_active: 0)。
そこで「右手のコントローラーを目の前の右下、腕を伸ばしたあたりに出して」と頼むと、Claude Code が座標を決めて openxr_set_controller_pose を呼びます。
{ "hand": "right", "position": [0.2, 1.3, -0.4], "orientation": [0, 0, 0, 1] }
その瞬間から is_active: true, simulated: true になり、アプリからはコントローラーが現れたように見えます。続けて「右手のトリガーを 1 秒間引いて」と頼めば openxr_set_controller_input で入力が注入されます(ボタンは 0/1、トリガー・グリップは 0.0〜1.0、スティックは -1.0〜1.0)。
skill の注意書きにもありますが、押して即離すと Update() で取りこぼすので、「1 秒間」のように押している時間を伝えるのがコツです。
「入力が届かない」ときの切り分けに使う
実例を一つ。Quest 3 のコントローラーを Simulator につないだのに、アプリが反応しませんでした。
そこで Claude Code に「Quest 3 のコントローラーが反応しない。どうすればいい?」と聞くと、まず openxr_get_active_interaction_profile を呼んで「ランタイムは左右とも /interaction_profiles/meta/touch_controller_plus を割り当てている」ことを確認し、続けて Unity CLI Loop 経由で Editor 内に C# を流し込み「Input System にコントローラーのデバイスが 1 つも登録されていない」ことを突き止めてきました。ランタイム側の情報は Operator から、Unity 側の情報は Unity CLI Loop から、と両方を突き合わせています。
原因は Unity 側の OpenXR 設定(Windows)で Touch 系の interaction profile を有効にしていなかったことです。Simulator が Touch Plus をバインドしても、アプリ側が対応する profile を提示していなければ入力は届きません。
Project Settings > XR Plug-in Management > OpenXR > Windows > Interaction Profiles に「Meta Quest Touch Plus Controller Profile」を追加して解決しました。
「ランタイムが何を選んでいるか」を自然言語で聞くだけで直接引き出せるのは、この手の問題の切り分けでかなり助かります。
用意されているツール
プロキシが持つツールは 25 個で、大きく 3 系統です。
-
観察系:
openxr_get_head_pose、openxr_get_controller_pose、openxr_capture_composited_image、openxr_get_session_info、openxr_get_system_info、openxr_get_active_interaction_profile、openxr_list_spatial_entities、openxr_get_frame_info -
操作系:
openxr_set_head_pose、openxr_set_controller_pose、openxr_set_controller_input、openxr_exit_session -
補助系: 座標変換(
convert_*、openxr_convert_pose_between_spaces)とクォータニオン演算(math_build_quat、math_multiply_quatなど)
Editor 側ブリッジには、シーン階層の取得、コンパイル、Test Runner、Building Blocks、UI 検証などのツールが別途あります。
実際に使ってわかった注意点
- Operator は Play Mode 中だけ生きている。 停止するとツールはすべて失敗します。エージェントに任せるときは「先に Play に入る」手順を含めてください。
-
Simulator の Activate は Unity 再起動で外れる。 起動のたびに
Meta > Meta XR Simulator > Activateが必要です。 - Unity エディタが非フォーカスだと Simulator が Unity を「応答なし」と記録する。 Play Mode の進行が間引かれるためです。テスト中は Unity を前面にしておくと安定します。
-
Game view は左目映像を「横幅合わせ・上下切り落とし」で表示している。 Simulator 稼働中に
Camera.main.ScreenPointToRayでマウス座標からレイを飛ばす種類のデバッグ処理は、そのままでは当たりません。左目投影(ScreenPointToRay(pos, Camera.MonoOrStereoscopicEye.Left))に表示の拡大率を補正して渡す必要がありました。 - 実機の Quest コントローラーを Simulator で使うには Data Forwarding が必要。 Simulator の Inputs パネルから、ヘッドセットに Data Forwarding サーバーをインストールして接続します。ヘッドセットのカメラがコントローラーを捉えていないと位置が来ないので、ヘッドセットの置き方にも注意が必要です。
-
Play Mode の停止時に、まれに Unity ごと落ちることがあった。 ログは OpenXR の終了処理(
xrDestroyInstance付近)で途切れていました。実験段階の機能なので、こまめな保存をおすすめします。
まとめ
Meta XR Operator は「AI エージェントに VR アプリの中を見せ、動かさせる」ための土台です。
インストールでは「Simulator は単体アプリ」「Activate は再起動で外れる」「OpenXR の API Layers 登録を確認する」の 3 点を押さえれば動きます。
動いてしまえば、頭の姿勢の取得・設定、コントローラーの注入、コンポジター映像のキャプチャがすべて MCP ツールで扱えるので、
「コードを直す → Unity CLI Loop で Play に入る → Operator でエージェントが歩いて確認 → スクリーンショットで報告」というループを、ヘッドセットを被らずに回せます。
まだ実験段階でクラッシュもありますが、XR 開発の自動テストを考えている方は一度触ってみる価値があると思います。