XREAL Air 2 Ultra × Unity 6 で Spatial Keyboard を実装する
はじめに
AR空間での文字入力は、パスワード認証や検索、マニュアルの作成において非常に重要です。
今回は XREAL Air 2 Ultra で、XR Interaction Toolkit (XRI) の「Spatial Keyboard」を利用し、空間に固定されるキーボードや視界に追従するキーボードの挙動を検証しました。
動作確認環境
- Unity: 6000.0.70f1
- XREAL SDK: 3.1.0
- AR Foundation: 6.0.6
- XR Interaction Toolkit: 3.0.10
- Device: XREAL Air 2 Ultra + Beam Pro
1. 主な機能
本プロジェクトでは、初期状態の認証(パスワード入力)を解除することで、2種類のキーボードエリアを体験できるように構成しています。
| 機能 | 内容 |
|---|---|
| Authentication | パスワード("12345")入力による機能ロックの解除 |
| World Keyboard | 3D空間内の特定の位置に固定して配置されるキーボード |
| Global Keyboard | 常にユーザーの視界(正面)に出現するシステム共通キーボード |
| XRKeyboardDisplay | 文字数制限(8文字)、確定時の自動消去、リアルタイム更新などの設定検証 |
2. XRKeyboardDisplay のインスペクター設定
空間キーボードを制御する中心的なコンポーネントが XRKeyboardDisplay です。このコンポーネントの設定次第で、入力のリアルタイム性や制限を自由に変更できます。
| 設定項目 | 内容・使いどころ |
|---|---|
| Use Scene Keyboard | ON: 空間に固定されたキーボードを使用 / OFF: 常に正面のグローバルキーボードを使用 |
| Update On Key Press | ON: 1文字打つたびに入力欄を更新 / OFF: 確定時のみ更新(パスワード等に便利) |
| Monitor Input Field Character Limit | InputField側で設定した「最大文字数(Character Limit)」をキーボードにも適用します |
| Clear Text On Submit | 送信(確定)ボタンを押したときに、入力欄の文字を自動で消去します |
| Clear Text On Open | キーボードを開いた瞬間に、以前の入力をリセットします |
| Always Observe Keyboard | 入力欄がフォーカスされていない時でも、常にキーボードの状態を監視します |
3.シーン構築と設定
空間キーボードの配置
- XRI のサンプル(
Spatial Keyboard/KeyboardDemo.unity)からオブジェクト一式をコピーしてシーンに配置します -
Input Field World Keyboardを複製し、認証用のPassWord Panelを作成します -
PassWord Panelに独自スクリプト(PinCodeManager.cs)をアタッチし、パスワードを設定します -
XRKeyboardDisplayのインスペクター下部にあるOn Text Submitted (String)イベントを探す -
+ボタンを押して、PinCodeManagerがアタッチされたオブジェクトをドラッグ&ドロップし、PinCodeManager > ValidateInputを選択します
4. スクリプトの実装:PinCodeManager.cs
パスワード入力を判定し、正解の場合にのみメイン機能(Display)を表示させるための管理スクリプトです。
using UnityEngine;
public class PinCodeManager : MonoBehaviour
{
[Header("Settings")]
[SerializeField] private string m_CorrectPin = "12345";
[Header("Target Objects")]
[SerializeField] private GameObject m_InputPanel;
[SerializeField] private GameObject m_Display1;
[SerializeField] private GameObject m_Display2;
private bool isDisplay = false;
public void ValidateInput(string input)
{
if (input == m_CorrectPin)
{
OnSuccess();
}
}
private void OnSuccess()
{
// パネルを非表示にし、検証用の機能エリアを有効化する
if (m_InputPanel != null)
m_InputPanel.SetActive(false);
if (m_Display1 != null)
m_Display1.SetActive(!isDisplay);
if (m_Display2 != null)
m_Display2.SetActive(!isDisplay);
isDisplay = !isDisplay;
}
}
5. ビルドとデプロイ(Beam Pro)
-
Build Settings: Platform を Android に変更し、
Build and Runを実行します - 接続: Beam Pro を PC に接続してインストールします
- アプリ起動: Beam Pro 内の MyGlasses アプリから起動し、カメラ権限および「他のアプリの上に表示」を許可します
6. 実際に動かしてみた感想
空間キーボードを実際に運用してみた所感です。
安定した入力体験
特に支障なくスムーズに使用することができました。入力時のレスポンスも良く、AR空間でのタイピングも違和感が少ないです。
活用の幅広さ
テキストの設定(文字制限やリアルタイム更新など)が非常に簡単にできるため、入力だけでなく、以下のような用途にも十分対応できそうです。
- マニュアル作成: 動画撮影中の説明用ポップアップ入力
- 確認テスト: 現場での点検結果やチェック項目の入力
- 認証フロー: 今回実装したようなパスワードによる機能制限
視界からキーボードが消えた際の自動再配置(Global Keyboard)も賢く、AR作業を妨げない設計が好印象でした。