自作HoloLensアプリで文字を入力する

こんにちは、mtwandこと00a3afです。あさぎです。

最近は日差しが強くなってきて、熱中症対策と共に、HoloLensのオーバーヒート問題なんかも気になってきました。 結露を避けつつ本体の温度を下げるのは結構気を使いますね。特にHoloLensはどうにも熱伝導率の低そうな素材が中心のガジェットなので、つい過激な方法で冷やしたくなりますが、「つい頭にきて…」では済まされなさそうなので慎重にやりましょう。いや、マジで。

さて、それはそうと前回書いた

mtholoblog.hatenablog.com

こちらの記事の続きです。

今回は

自作HoloLensアプリで文字を入力する

話をします。

uGUIは使えない

まず、uGUIは使えません。 いや、ボタンとかは使えた気がします。試してないけど…。

とりあえず、InputFieldなどは普通には使えません。 UnityEditor上だと普通に使えるのですが、HoloLensに持っていくと、タップしてもアクティブになりませんし、キーボードが立ち上がることもありません

(キーボードを呼び出す方法はあるようです)

littlewing.hatenablog.com

ただし、uGUI自体が全く動かないわけではなく、uGUIを配置して表示させることなどは普通にできますので、これはこれで利用していきます。

キーボードが出ないなら作ればいいじゃない

2vr.jp

これこれ、これですよ。

詳しくは記事を読んでもらうとして、発想だけ パク 参考にします。 特に今回はIPアドレスを前提としたものだったので、フルキーボードを読んでしまうと役不足になりますし。

今回作ったのはこういうものです

f:id:mtwand:20170729164609p:plain

0-9, ., Del, Enter ボタンをUnityのCubeから作成し、配置。それぞれに自作のKeyManagerをアタッチします。

KeyManager

KeyManagerは今回のために作成したスクリプトです。

BaseKeyManagerというスクリプトを基底クラスとして持ち、 Any KeyManagerのように命名されます。

これを三種類、今回は CharKeyManager , DelKeyManager , EnterKeyManager を作成しました。

BaseKeyManagerは MonoBehaviour を継承するクラスで、 private void OnSelect()virtual void Clicked() を持ちます。 OnSelect()GazeGestureManager で AirTap 時に呼ばれる関数で、これが呼ばれたとき、この関数は Clicked を呼び出します。

ClickedはBaseKeyManager上では動きが定義されていません。継承先であるCharKeyManager, DelKeyManager, EnterKeyManager でそれぞれ規定されます。

今回は transform.parent.gameObject.SendMessageUpwards("OnClickChar", character); のように書きました。

これでこのボタンを内包するGameObjectでボタンのクリックが検知できるようになります。

Windowを作る

今回は、多少汎用的に作りたいという思いもあり、Windowオブジェクトと、それを管理するWindowManagerを作りました。

ただこれは個人的にまだ改良したい部分があるので詳しくは解説いたしません。

さしあたっては、先程作成したキーを内包するオブジェクトと、そこにアタッチされた private void OnClickChar(string character) などのイベントを処理する関数を持つスクリプトが存在するとお考え下さい。

そして OnClickChar などの関数はそれぞれ後ほど作成するInputField上の文字列を操作する

text = GameObject.Find("InputField").GetComponent<inputField>().text + character;
GameObject.Find("InputField").GetComponent<inputField>().text = text;

のような処理をします。(Del, Enterなどのボタンも同様にそれぞれの処理を作ります)

InputFieldを配置

入力した文字を表示・保持するためのInputFieldを配置します(試してませんが3DTextでも問題はないはずです)。

先ほど作ったWindowの配下にCanvasを、さらにその下にInputFieldを作成します。

Canvasは設定を変え、WorldSpace上、Windowの中に配置されるようにしてください。HeadLockedはMR的ではないという話もありますし。

f:id:mtwand:20170729171032p:plain

↑こんな感じに

あと、uGUI使うときいつも困るのですが、デフォルトの設定どうにかならないんですかね。輪郭ぼけてるし、文字デカイし。 ってことで、これも調整します。

f:id:mtwand:20170729171230p:plain

はい。なんかだいたいこういう感じにしていつも使ってます。正しいのかどうか、私にもわかりません。どなたか最適解があれば教えてください。

起動

さて、こうしてInputFieldまで設置したら、あとはもうほとんどやることはありません。 今まで作ったObjectを正しく配置して、アプリを起動すればといりあえず、IPアドレスを入力できるダイアログが完成です。

あとはこれをPrefabやらなにやら好きなように加工して自作アプリに埋め込んでください。

KeyBoardの配置を考える必要はありますが、やろうと思えばフルキーボードも自作できると思います。アセットもあるしおすすめはしませんが…。

個人的にはこれを少し改造してGoogleGodanキーボードでも作ってみようかなと思っています。変換までやる気はないですが、かな文字だけでも打てたら少しはホロラビリティ(造語)が上がりそうですね。

詳しくは近々UnityのプロジェクトをGithubにでも上げられたらと思うので、記事を読んでもわからないという方、すぐ使いたいという方はそちらをお待ちいただくか、素直にアセット買った方が良いでしょう。

というか、AirTapを必要としない文字入力の手段が欲しいですね、音声以外で。