トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

MRTK2でuGUI入力とシステムキーボード呼び出し【Hololens1】

 セットアップが終わったのでUIを扱っていきたい!

bibinbaleo.hatenablog.com

Unity2018.4、MRTK2.2.0、Hololens1

サンプルシーン 

ExampleのHandInteractionExampleシーンをビルドして動かした。

f:id:bibinbaleo:20200127115928p:plain

Holoens1でも動いた!

OpenKeyboardというボタンを押したら、システムのキーボードは表示されて動かせたけど、入力した文字が表示されなかった。

というかそもそも全部の文字が表示されてなかった気がする。

f:id:bibinbaleo:20200127115934p:plain

f:id:bibinbaleo:20200423170718p:plain

f:id:bibinbaleo:20200423170721p:plain

IOExceptionエラー

文字表示を治すために、UnityEditorに出ていた謎のウィンドウで何かをInstallしたら、文字は表示されるようになったけど、代わりにビルドできずにIOExceptionエラーが出た。

f:id:bibinbaleo:20200127115931p:plain

一旦以前ビルドしたフォルダを消したらうまくいった。

ちゃんと文字も表示された。けど日本語は表示されなかった。

□□になる。

フォントが対応していない?TextMeshだから?まあいいや

自分のシーンでuGUIを動かす

新しいシーンを作ったら、上のメニューのMixedRealityToolkit>Add to Scene Configureを押すと、シーンがセットされる

f:id:bibinbaleo:20200127125921p:plain

Canvas設定

Canvasを追加

Canvasに表示される「Convert to MRTK Canvas」を押すとCanvasUtilityスクリプトがつく

f:id:bibinbaleo:20200127123012p:plain

Add NearInteractionToucharableUnityUIを押す。なくてもいいのかな?

f:id:bibinbaleo:20200127123009p:plain

ここに説明が書いている気がする。

microsoft.github.io

Near~ではPointerとTouchが選べる。

f:id:bibinbaleo:20200127123007p:plain

Hololens2のハンドトラッキング用の選択だと思われる。

今はHololens1で操作するのでPointerにした。

canvasのScaleは0.001ぐらい

uGUI

Canvasの設定が終わったらあとは普通にuGUIを置いたらすぐに使えた。

f:id:bibinbaleo:20200127134314p:plain

ただInputFieldをクリックしてもキーボードが自動で表示されることはなかった。Androidスマホとかだと勝手にOSのキーボードが出るんだけどな~

キーボード表示

サンプルシーンのSystemKeyboardExample.csによると、システムキーボードをスクリプトから表示するにはこんな感じらしい。

public void OpenSystemKeyboard()
        {
#if WINDOWS_UWP
            wmrKeyboard.ShowKeyboard(wmrKeyboard.Textfalse);
#elif UNITY_IOS || UNITY_ANDROID
            touchscreenKeyboard = TouchScreenKeyboard.Open(string.Empty
       TouchScreenKeyboardType.Defaultfalsefalsefalsefalse);
#endif
        }

 

 wmrKeyboardはMixedRealityKeyboard。

適当にこんな感じのコードを書いた

using Microsoft.MixedReality.Toolkit.Experimental.UI; 
    
 private MixedRealityKeyboard wmrKeyboard;

void Start()
{
 wmrKeyboard = gameObject.AddComponent<MixedRealityKeyboard>();       
}
 
public void ONShowKeyboard(){

  wmrKeyboard.ShowKeyboard(wmrKeyboard.Text, false);

}

void Update(){

  _InputField.text = wmrKeyboard.Text;

 }

 

これでちゃんとキーボードが表示されて、InputFieldに入力できた!!!

キーボードは勝手に頭に追従した。

 

MixedRealityKeyboard.ShowKeyboardについてのリファレンスは下

microsoft.github.io

 追記:20200402

実際にはこういうスクリプトを適当なオブジェクトに付けて、InputFieldの下にButtonを置いて、そこのイベントからOnShowKeyboard()を呼び出してInputFieldを設置した。

using UnityEngine;
using Microsoft.MixedReality.Toolkit.Experimental.UI;
using UnityEngine.UI;

public class ShowKeyboardForHololens : MonoBehaviour
{

    private MixedRealityKeyboard _MRKeyboard;


    void Start()
    {
        _MRKeyboard = gameObject.AddComponent<MixedRealityKeyboard>();
    }

    public void OnShowKeyboard(InputField inputField)
    {

        _MRKeyboard.ShowKeyboard(_MRKeyboard.Text, false);
        inputField.text = _MRKeyboard.Text;

    }
}

f:id:bibinbaleo:20200402113025p:plain

UI追従

HololensにはOculusみたいな正面補正機能がないらしい。

じゃあ重要なUIはある程度BodyLockしたほうがいいかな。

MRTK1はtagalongというコンポーネントでできたらしいけど、MRTK2はSolverSystemになったそう

www.slideshare.net

RadialViewを付けたらSolverHandlerも勝手についた。RadialViewがないと追従しないっぽい

f:id:bibinbaleo:20200127134317p:plain

TrackedTargetTypeはHead。Holo2だと手に追従とかもできるみたい。

 

動かしたら、なんとなくついてはくるけど、うまく視界に入ってついてきてくれない。

RadialViewMaxViewDegreeを小さくすると常に視界の真ん中に入ってきてくれた。デフォルトは30だった。

f:id:bibinbaleo:20200128095905p:plain

あとBillboardもつけて向きも追従した

f:id:bibinbaleo:20200127134626p:plain

UIを常に手前に表示する

Hololensが自動でオクルージョンしてくるので、UIが物の陰に隠れるときがある。

常に手前にしたい。

qiita.com

Camera二つ作るしかないのか?

InputModuleのエラー

既存のシーンにMixedRealityToolkit>Add to Scene Configureをするとエラーが起きた。

For Mixed Reality Toolkit input to work properly, please remove your other input module(s) and add a MixedRealityInputModule to your main camera.

EventSystemに対して出てる。

シーンをMRTK用にセットしたらMainCameraに自動でMRTK用の?EventSystemがつくのでそれを使え!既存のEventSystemは消せという意味だと思う。