はじめに
本記事ではQuestの入力関連処理の際に立ち上がるキーボード(以後システムキーボード)を自作アプリで利用する方法についてメモします。
システムキーボードは多言語対応、変換対応、計算されつくしたUIUXを備えており、非常に使い勝手に優れています。
自作アプリに入力系の実装予定がある場合、システムキーボードを利用することはかなり大きなアドバンテージとなります。
バージョン情報
ツール、ライブラリ | バージョン |
---|---|
Unity | 2021.3.32f1 |
Meta XR Core SDK | 59.0.0 |
挙動
以下が挙動の簡易的なデモです。InputFieldを選択する
とシステムキーボードが立ち上がります。
注意点として、システムキーボードが立ち上がるとアプリはフォーカス外にある状態となります。
入力を終了する、あるいはシステムキーボード外のエリアをトリガーでクリックすることにより、フォーカスがアプリに戻ります。
実装方法
以下パスのアセットファイルのRequires System Keyboard
をTrueにします。
Assets/Oculus/OculusProjectConfig.asset
なんとこれだけでシステムキーボードが利用可能になります。
InputFieldのフォーカスが合ったかどうかや、既にInputFieldに文字が入力されているかなどを実装する必要はありません。
さらに踏み込んだ話をすると、”OpenXRを利用しているのでわざわざこのためにMeta XR Core SDKをプロジェクトに導入したくない”みたいなシチュエーションにおいては、以下をAndroidManifestに書き込むだけで利用可能となります。
<uses-feature android:name="oculus.software.overlay_keyboard" android:required="false"/>
入力フィールド以外における呼び出し
ここまでの対応で入力フィールドのフォーカスに応じたシステムキーボードの呼び出しが可能となりました。
もう一歩踏み込んだ実装として、"入力フィールド以外の箇所でのシステムキーボードの呼び出し"について考えます。
例えば、キャラクターを選択するとそのキャラクターの名前を入力する画面が立ち上げるようなシチュエーションです。
このようなシチュエーションを想定してプログラムからシステムキーボードを有効にする手段が用意されています。
以下が実際にプログラムから呼び出すサンプルです。
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class KeyboardTest : MonoBehaviour
{
[SerializeField] private Button _button;
[SerializeField] private TextMeshProUGUI _textMeshProUGUI;
private TouchScreenKeyboard _overlayKeyboard;
private void Start()
{
_button.onClick.AddListener(OnClickButton);
}
private void Update()
{
if (_textMeshProUGUI.text == _overlayKeyboard.text) return;
_textMeshProUGUI.text = _overlayKeyboard.text;
}
private void OnDestroy()
{
_button.onClick.RemoveAllListeners();
}
void OnClickButton()
{
_overlayKeyboard = TouchScreenKeyboard.Open(_textMeshProUGUI.text, TouchScreenKeyboardType.Default);
}
}
以下GIFのようにButtonをトリガーとしてシステムキーボードの呼び出しを行うことができました。入力結果を保持しておき、利用することも可能です。
追記 2023/12/19
一週間前くらいからOSレベルのバグがあるらしく、まともに動作しない状態となっています。我々ではどうしようもできないので、Metaのアップデート待ちです。