トマシープが学ぶ

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

VRTKとInputField

VRTKのキーボード

VRTKのサンプルシーン(34)にあるキーボードを自分のシーンにもってきて入力する。

f:id:bibinbaleo:20190801115622p:plain

Keyboardプレハブ自体はこんな感じ。

f:id:bibinbaleo:20190801133822p:plain

UI_Keyboardでキー入力やEnterの処理をしている。

 

入力自体はすぐにできた。

InputFieldをクリックしなくてもVRTKのキーを入力したら反応する。

ただinputfieldのtextに文字を流しているだけ

input.text += character;

もはやただのText表示みたいなもの。InputFieldである必要性があんまりない。

使ってあるのPlaceholderぐらいでは(入力する前の「InputText...」という表示)

 

カーソルもなぜか出ていない。

サンプルシーンでは出ていたのか?サンプルシーンはエラーとか゚VRのレーザーが反応しなかったりでプレイできていない。

negi-lab.blog.jp

 

独自のInputField

今はWorldKeyboardというオブジェクトの子のInputFieldに反応するようになってるけど、自分で作った別の場所にあるInputFieldに入力内容が出るようにしたい。

f:id:bibinbaleo:20190801115627p:plain

スクリプトはこんな感じで自分の子のInputFieldを取得している。

input = GetComponentInChildren<InputField>();

自分で作ったInputFieldをインスペクタからセットする感じにした。

public InputField inputSearchTablet;

f:id:bibinbaleo:20190801115634p:plain

input = inputSearchTablet;

f:id:bibinbaleo:20190801115638p:plain

f:id:bibinbaleo:20190801115617p:plain

ちなみにもともとキーボードのスクリプト名はUI_Keyboardという名前だった。

いじっていくので別のスクリプトを作った。

別のスクリプトにしたらそれぞれのキーボタンの参照も変わる。ヒエラルキーで選んで全部一気に替えられた。

f:id:bibinbaleo:20190801133848p:plain

 

InputFieldをクリックでエラー

でもInputFieldをクリックするとエラーが出る。

NullReferenceException: Object reference not set to an instance of an object
UnityEngine.UI.InputField.ActivateInputFieldInternal () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:2835)
UnityEngine.UI.InputField.LateUpdate () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/InputField.cs:1260)

今はinputFieldをクリックしなくてもキーを押したらすぐに入力が開始される。

動作はちゃんとするんだけど。

治った?

なんか治った。上のスクリプト変えるやつやったら出なくなった。

でもキーボードを表示してない状態でInputFieldを押すと同じヌルが出る

なんなんだろう。

ReadOnlyにしても変わらなかった。

f:id:bibinbaleo:20190801140552p:plain

tech.pjin.jp

InputFieldのクリックでキーボードを出す

InputFieldを押したらVRTKのキーボードをactiveにしたい。

でもInputFieldにClickの関数なんてない。

この方が同じようなことをしている。

tuti107.hatenablog.com

InputFieldを押したときってどうやってとるの?OnSelectが来た時ってこと?

docs.unity3d.com

ちなみにInputFieldにbuttonを付けようとすると怒られました。

f:id:bibinbaleo:20190801143505p:plain

 

buttonを上に重ねた

結局InputFieldの上に透明なボタンを重ねました。

 

でクリックしたらKeyboardがActiveになるようにする。

f:id:bibinbaleo:20190801145319p:plain

キーボードはEnterを押したら自分が消えるようにしました。

public void Enter()
{
input.text = "";
this.gameObject.SetActive(false);
}

これでInputFieldのクリックが反応してエラーが出ることもなくなったしいいのでは。

ついでにキーボードに×ボタンもつけよう。

Android

InputFieldを押したらAndroidだとスマホのキーボードが出てくるそうです。

Questでやってみたけどさすがに出てこなかった。

ただ昔、VysorでGoの画面共有をした時はVysorのPCのほうに出てきた気がします。

この方は結局ボタンをInputFieldっぽくしています。

tuti107.hatenablog.com

最低限はこれでもいいし、むしろこっちのほうが楽な気はするけど、カーソルやPlaceholderのテキストとか゚が作れない。デザイン的なあれ。

InputFieldの入力を受け付ける機能は本当に要らないんだよな。

その他

inputField.ActivateInputField();でスクリプトからフォーカスを当てることはできるらしい。

gomafrontier.com

今まではInputFieldをクリックすることでフォーカス(文字を入力できる状態にすること)していましたが、スクリプトでフォーカスすることもできます。

【Unity入門】InputFieldに入力された文字列をテキストに反映させよう! | もぎブログ

最後に

というかなんでカーソル出てないんだろう?入力を受け付けていない??

ただテキストに流しているだけだから?

docs.unity3d.com