NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

HoloLensアプリにKeyboardを組み込む

こんにちは。
クラウド事業本部コンサルティング&テクノロジー部の酒井です。

HoloLensアプリ内で文字入力が必要な場合、Keyboardを出したいと思ったことはないでしょうか?
D3DアプリではHoloLensのキーボードをそのまま使うことができないのですが、MixedRealityToolkit(MRTK)に3DKeyboardのPrefabが含まれており、これを使うことで簡単にKeyboardが出せるようになっています。
今回はMRTKのKeyboard Prefabを使って、手っ取り早く文字入力できる方法を説明します。

この記事はネクストスケープ クラウド事業本部 Advent Calendar 2017の20日目となります。

f:id:nextscape_blog:20210911160541j:plain

 

今回の検証環境

  • Unity:2017.2.1f1
  • MixedRealityToolkit(MRTK):2017.2.1.0(MixedRealityToolkit for Unity 2017.2.1f1)

シーンを準備する

まずは通常のHoloLensアプリと同じく、MRTKのインポートやプロジェクトの設定、シーンの作成を行います。

続いて、MRTKから下記のPrefabをシーンに入れます。

  • HoloToolkit/Input/Prefabs/Cursor/Cursor
  • HoloToolkit/Input/Prefabs/InputManger
  • HoloToolkit/UX/Prefabs/Keyboard

f:id:nextscape_blog:20210911160613p:plain

キーボードオブジェクトはカメラの設定が必要ですので、InspectorからCamera項目にMainのカメラを設定します。
※これを行わないと視線が取れません。

f:id:nextscape_blog:20210911160632p:plain

今回はさらにキーボードを表示するためのボタンとなるオブジェクト(InputStart)と入力した文字を表示するオブジェクト(InputText)を追加し、下記のようなシーンを作成しました。

f:id:nextscape_blog:20210911160653p:plain

キーボードを表示・入力値取り込みを行うスクリプトを用意する

今回はInputStartオブジェクトをタップするとキーボードを表示し、入力値をInputTextオブジェクトに入れるようなスクリプトを作成します。
InputStartスクリプトを作成し、下記のコードを貼り付けてください。

InputStart.cs

  1. using System;
  2. using HoloToolkit.UI.Keyboard;
  3. using HoloToolkit.Unity.InputModule;
  4. using UnityEngine;
  5.  
  6. public class InputStart : MonoBehaviour,IInputClickHandler
  7. {
  8.     // キー入力先のTextMesh
  9.     public TextMesh TargetTextMesh;
  10.  
  11.     public void OnInputClicked(InputClickedEventData eventData)
  12.     {
  13.         // すでにキーボードを開いていれば閉じる
  14.         Keyboard.Instance.Close();
  15.  
  16.         // キーボードを表示する
  17.         Keyboard.Instance.PresentKeyboard();
  18.  
  19.         // キーボードの位置をオブジェクトの近くに調整する
  20.         Keyboard.Instance.RepositionKeyboard(transform, null, 0.1f);
  21.  
  22.         // キー入力値更新時のイベントを設定する
  23.         Keyboard.Instance.OnTextUpdated += KeyboardOnTextUpdated;
  24.  
  25.         // キーボードを閉じたときのイベントを設定する
  26.         Keyboard.Instance.OnClosed += KeyboardOnClosed;
  27.     }
  28.  
  29.     private void KeyboardOnTextUpdated(string s)
  30.     {
  31.         // 入力された文字列が渡されるので、
  32.         // TextMeshにセットする
  33.         TargetTextMesh.text = s;
  34.     }
  35.  
  36.     private void KeyboardOnClosed(object sender, EventArgs eventArgs)
  37.     {
  38.         // イベントを解除する
  39.         Keyboard.Instance.OnTextUpdated -= KeyboardOnTextUpdated;
  40.         Keyboard.Instance.OnClosed -= KeyboardOnClosed;
  41.     }
  42. }

スクリプトを作成しましたら、InputStartオブジェクトに追加します。
Inspectorで表示先のTextMeshを設定するようにしてありますので、追加後にInputTextオブジェクトをドロップして設定します。

f:id:nextscape_blog:20210911160735p:plain

結果

HoloLensにデプロイしてアプリを実行するとKeyboardと書かれたオブジェクトが表示されますので、ここをタップするとキーボードが表示されます。
また、入力した値がタップしたオブジェクトの上部に表示されます。

f:id:nextscape_blog:20210911160541j:plain

さいごに

HoloToolkit-ExampleのKeyboardSampleSceneにはここで紹介していない機能を使ったデモもありますので、興味のある方は参考にしてみてください。