MRが楽しい

MRやVRについて学習したことを書き残す

HoloLensでシステム組み込みのキーボードを利用する

本日は HoloLens の技術調査枠です。
HoloLens のOS組み込みのキーボードを利用する手順をまとめます。
f:id:bluebirdofoz:20190226204149j:plain

前回記事の続きです。
bluebirdofoz.hatenablog.com

HoloLensのOS組み込みのキーボードについて

RS5 以降ではOS組み込みのキーボードを Unity 内で呼び出すことが可能です。
システムに組み込まれたキーボードのため、MRTK のキーボードと以下の点が異なります。
・付属の音声認識による入力を利用できる
・パネルアプリでもそのままキーボードを呼び出せる
・日本語版OSであれば、日本語入力を行える

一方で以下のようなデメリットもあります。
・特定のプラットフォームでのみ利用可能(iPhoneAndroidWindows Phone、Windows Store Apps)
・キーボードの表示位置を指定できない
・HoloLens上では一部正常に動作しない箇所がある(後述)

プロジェクトとシーンの準備

前回記事を参考に、確認用のパネルを用意したプロジェクトを作成します。
bluebirdofoz.hatenablog.com
f:id:bluebirdofoz:20190226204210j:plain

キーボードの利用方法

シーン内に keyboard オブジェクトを配置する必要はありません。
UnityEngine.TouchScreenKeyboard でキーボードを呼び出すだけです。
docs.unity3d.com

以下の機能を持つスクリプトを作成します。
1.本スクリプトをアタッチしたオブジェクトをタップするとキーボードを表示する
2.キーボードで文字入力を行うと、同期的にテキストフィールドを更新する

・UnityKeyboardShow.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR.WSA.Input;
using HoloToolkit.Unity.InputModule;

public class UnityKeyboardShow : MonoBehaviour, IInputClickHandler
{
    /// <summary>
    /// 文字列を反映するテキストフィールド
    /// </summary>
    [SerializeField, Tooltip("文字列を反映するテキストフィールド")]
    private Text TargetInputField;

    /// <summary>
    /// Unityキーボードの参照
    /// </summary>
    private TouchScreenKeyboard p_keyboard = null;
    
    /// <summary>
    /// 定期実行
    /// </summary>
    void Update()
    {
        // キーボードのインスタンスが生成済みか
        if (p_keyboard != null)
        {
            // キーボードの入力値をテキストフィールドに設定する
            TargetInputField.text = p_keyboard.text;
        }
    }

    /// <summary>
    /// アタッチオブジェクトのタップイベント
    /// </summary>
    /// <param name="eventData"></param>
    public void OnInputClicked(InputClickedEventData eventData)
    {
        // キーボードのインスタンスが生成済みか
        if (p_keyboard == null)
        {
            // 初回実行時はインスタンスを生成してキーボードを表示する
            // RS5の時点では KeyboardType を変更しても変わらない
            p_keyboard = TouchScreenKeyboard.Open(string.Empty);
        }
        else
        {
            // 2回目以降は active 値を true にすることで表示する
            p_keyboard.active = true;
        }
    }
}

作成したスクリプトを Panel オブジェクトにアタッチします。
f:id:bluebirdofoz:20190226204254j:plain

キーボード入力に合わせて更新するテキストフィールドを指定します。
TargetInputField に Text オブジェクトを設定します。
f:id:bluebirdofoz:20190226204306j:plain

これで設定完了です。
TouchScreenKeyboard は UnityEditor 上ではサポートされていないため、[再生]ボタンで動かしてみてもキーボードは表示されません。
f:id:bluebirdofoz:20190226204317j:plain
動作確認は HoloLens 上で実施する必要があります。

HoloLensでの動作確認

HoloLens(WindowsMR)プロジェクトの作成手順に従って、アプリを HoloLens にインストールします。
同じく Panel をタップしてキーボードを表示します。
f:id:bluebirdofoz:20190226204329j:plain

文字列を入力して、テキストフィールドが更新されることを確認しましょう。
f:id:bluebirdofoz:20190226204340j:plain

HoloLens上で一部正常に動作しない問題?

私の環境で TouchScreenKeyboard を利用した場合、以下の問題を検出しました。
・isSupported の情報で false が返ってくる
・[×]やブルームでキーボードを閉じると、status が Visibule のままキーボードが消失する(再表示できない)
正常に動作しない場合は MRTK のキーボードを利用しましょう。

TouchScreenKeyboard の説明ページには「XAML ベースのアプリケーションのみをサポートします」とあるので、もしかしたらD3Dでも呼び出せること自体が想定外の動作なのかもしれません。