はじめに:静的なVR空間は、もう退屈だ。
AIハック術師のハヤトだ。
結論から言おう。2025年、XR(VR/AR)開発において「あらかじめ作られたシナリオ」をなぞるだけの体験は、もはやレガシーになりつつある。
想像してほしい。プレイヤーの言葉に合わせて性格を変えるNPC、視線を向けるだけで生成されるオブジェクト、そして「その場の思いつき」でルールさえも書き換わる仮想空間。これを実現するのが、Unity XR Interaction Toolkit (XRI) 3.0 と マルチモーダルAI の融合だ。
今回は、Unity公式がGitHubで公開している「宝の山」とも言えるサンプルプロジェクトをベースに、生成AI(OpenAI API)を組み込んで、「対話で空間に干渉する」次世代のXRインタラクションを実装する方法を解説する。
単なるツールの紹介ではない。これは、君の手で「終わりのない世界」を作るための実践ガイドだ。
1. Unity XR Interaction Toolkit 3.0 の革新と「公式GitHub」の価値
まずは武器を選ぼう。なぜ今、XRI 3.0なのか。そしてなぜ公式サンプルが重要なのか。
XRI 3.0:開発速度を倍増させる「Near-Far」の統合
以前のバージョン(2.x系)で開発者を悩ませていたのが、「遠くの物を指すレイ(Ray)」と「近くの物を掴む手(Direct)」の切り替え処理の複雑さだ。
XRI 3.0ではこれが劇的に進化している。
- Near-Far Interactor: 1つのコンポーネントで遠近両方の操作をシームレスに処理。コード量が激減する。
- Input Reader: 入力デバイスの違い(Meta Quest, Vision Pro, HTC VIVEなど)を抽象化し、マルチプラットフォーム対応が容易に。
- Gaze Interaction: 視線追跡の統合強化。これこそが「見て生成する」AI機能との相性が抜群に良い理由だ。
GitHubサンプルが「最強の教科書」である理由
多くの初心者が有料アセットに飛びつくが、実はUnity公式がGitHubで公開している XR Interaction Toolkit Examples こそが、最も信頼性が高く、拡張性の高いベースプロジェクトだ。
| サンプルシーン名 | AI開発での応用アイデア |
|---|---|
| Station 7: 2D UI | VR空間内に浮かぶ「AI対話コンソール」としてそのまま利用可能。 |
| Station 4: Socket Interactors | 「AIに頼んで生成したアイテム」が出現する台座(クラフト台)として活用。 |
| Station 5: Gaze Interaction | ユーザーが見ている対象物をAIに解析させる(Vision機能)トリガーに使用。 |
この記事では、この中の「UIインタラクション」をハックして、AIへの命令インターフェースへと作り変えていく。
2. マルチモーダルAI × XR が生み出す「3つの未来」
技術的な実装に入る前に、何を「ゴール」にするかを明確にしておこう。単にChatGPTとチャットするだけなら、スマホで十分だ。XR空間で目指すべきは以下の体験だ。
- 空間コンシェルジュ (Spatial Agent):
「そこの赤い箱を取って」と指差しながら音声で指示すると、AIが意図を理解してそのオブジェクトを動かす。 - ジェネレーティブ・ワールド (Generative World):
「もっと暗くして、不気味な雰囲気にして」と言うと、スカイボックスやライティング、BGMがリアルタイムで再生成される。 - NPCの魂の実装 (Soulful NPC):
決まったセリフではなく、プレイヤーの行動(近づく、武器を向けるなど)をXRIのイベントで検知し、動的に反応を変えるキャラクター。
3. 実践ガイド:VR空間に「AIの脳」を実装せよ
ここからは実際に手を動かしてもらおう。UnityのXR環境に、OpenAIのAPIを接続し、VR内のキーボードで質問するとAIが答えてくれる最小構成のプロトタイプを作成する。
Step 1: 環境構築とサンプルのインポート
- Unity 2022.3 (LTS) 以降でプロジェクトを新規作成(3D Core または VR Template)。
- XR Interaction Toolkit をPackage Managerからインストール(バージョン3.0.x以上を確認)。
- GitHubからダウンロードした「XR Interaction Toolkit Examples」の
Assets/Samples/XR Interaction Toolkit/[Version]/Starter Assetsをインポートする。 - サンプルシーン(例:World Space UI)を開き、VRヘッドセット(Quest Link等)で動作確認する。
Step 2: OpenAI通信用スクリプトの作成
外部アセットを使わず、C#標準の UnityWebRequest だけで実装する。これが最も軽量で、ブラックボックス化しない方法だ。
プロジェクトに AIController.cs というスクリプトを作成し、以下のコードを記述してほしい。
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using TMPro;
public class AIController : MonoBehaviour
{
[Header("AI Settings")]
[SerializeField] private string apiKey = "YOUR_OPENAI_API_KEY"; // 本番では環境変数等で管理すること
[SerializeField] private string model = "gpt-4o-mini";
[Header("UI Connections")]
[SerializeField] private TMP_InputField inputField; // VRキーボードからの入力
[SerializeField] private TextMeshProUGUI outputText; // AIの回答表示
private const string ApiUrl = "https://api.openai.com/v1/chat/completions";
// ボタンのOnClickイベントから呼び出すメソッド
public void SendRequestToAI()
{
if (string.IsNullOrEmpty(inputField.text)) return;
StartCoroutine(PostRequest(inputField.text));
}
private IEnumerator PostRequest(string userMessage)
{
outputText.text = "Thinking...";
// JSONデータの作成
string jsonBody = "{\"model\": \"" + model + "\", \"messages\": [{\"role\": \"user\", \"content\": \"" + userMessage + "\"}]}";
byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonBody);
using (UnityWebRequest request = new UnityWebRequest(ApiUrl, "POST"))
{
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("Authorization", "Bearer " + apiKey);
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
outputText.text = "Error: " + request.error;
}
else
{
// 簡易的なJSONパース(本来はJsonUtility用のクラス定義を推奨)
string responseText = request.downloadHandler.text;
// ※ここでは簡易的にコンテンツ部分を抽出する処理を想定
outputText.text = ExtractContent(responseText);
}
}
}
// 簡易パーサー(実運用ではNewtonsoft.Jsonなどを推奨)
private string ExtractContent(string json)
{
string searchKey = "\"content\": \"";
int startIndex = json.IndexOf(searchKey);
if (startIndex == -1) return json;
startIndex += searchKey.Length;
int endIndex = json.IndexOf("\"", startIndex);
return json.Substring(startIndex, endIndex - startIndex).Replace("\\n", "\n");
}
}
Step 3: シーンへの統合
ここが「ハック」のポイントだ。サンプルシーンにある既存のUIを流用する。
- シーン内の適当なGameObjectに
AIController.csをアタッチする。 - サンプルのCanvas内にある InputField (TMP) と Text (TMP) を、スクリプトのインスペクタにドラッグ&ドロップして紐付ける。
- サンプルの「Submit」ボタン(または適当なButtonコンポーネント)の
OnClickイベントに、AIController.SendRequestToAIを登録する。 - 再生ボタンを押し、VR空間内のキーボードで「Unityについて教えて」と入力して送信してみよう。
Step 4: インタラクションへの応用(応用編)
テキストが返ってくるだけでは面白くない。AIの応答に応じて空間を操作するには、AIに「Function Calling(関数呼び出し)」のようなJSONを返させればいい。
プロンプト(messagesの部分)に以下のようなSystem指示を加えてみよう。
"system", "content": "あなたはVR空間の管理者です。ユーザーが色を変えたいと言ったら、回答の先頭に [COLOR:RED] のようなタグをつけてください。"
そしてC#側で [COLOR:RED] を検知したら、GetComponent<Renderer>().material.color = Color.red; を実行するロジックを追加する。これで、「赤くして」と言うだけで目の前のキューブが赤くなる魔法が完成する。
4. まとめと次なる戦略
Unity XR Interaction Toolkit 3.0 は、VR開発の面倒な部分をすべて引き受けてくれる。そして公式サンプルは、その機能を使いこなすための最短ルートだ。
今回の要点は以下の3つ。
- XRI 3.0の新機能(Near-Far統合)を活用し、インタラクション開発の工数を削減せよ。
- GitHubの公式サンプルを単なる見本ではなく、自作アプリの「土台」として使い倒せ。
- 生成AIをAPI経由で接続し、テキストだけでなく、空間操作(色変更、生成など)へと拡張せよ。
これからは、コードを書くだけでなく、「AIという同僚」をどうVR空間に住まわせるかが開発者の腕の見せ所になる。さあ、HMDを被って、君だけの無限の世界へダイブしよう。


コメント