トマシープが学ぶ

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

MRTKのキーボードで入力した値を取得してタイピングゲームにつなげた。

MRTKのキーボードで入力した値を取得して、前に作ったタイピングゲームを動かしたいです。(OculusGoで動かすよ!)

f:id:bibinbaleo:20180916174558p:plain

bibinbaleo.hatenablog.com

OculusGoにMRTKのキーボードを入れて入力をして、キーボードについている入力画面に文字が表示されるところまでは以前やりました。

bibinbaleo.hatenablog.com

以下私にしかわからないかもしれない。

MRTKのどこに文字はいってるんや

MRTKのキーボードをクリックしたらどの変数にその文字は入っているのか

MRTKの分析記事を書いてくださっているこちらの記事によれば↓

/Knowledge/Programming/Unity/MRTK.UX.Keyboard メモ

 UnityEngine.UI.Button のクリックイベントが発火すると,Keyboard の AppendValue(...)
 メソッドが呼ばれ,InputField の text が更新される.

とあります。

Keyboardスクリプトはキーボードプレハブの一番上にあります。

f:id:bibinbaleo:20180916183516p:plain

f:id:bibinbaleo:20180916183431p:plain

ここのどれかに入っているのか?

 

もう一つこの記事

blog.nextscape.net

この記事ではテキストをこんな感じで取得している

f:id:bibinbaleo:20180916190807p:plain

using HoloToolkit.UI.Keyboard;
using HoloToolkit.Unity.InputModule;

これを入れるとエラーが一部消えた。

 

ところでこのスクリプトは、どうやって文字を取得しているの?

Keyboard.Instance.OnTextUpdated += KeyboardOnTextUpdated;

これの意味って?

KeyboardのOnTextUpdateをどうにかこうにかしているの?

f:id:bibinbaleo:20180916191105p:plain

punlicだからほかのスクリプトから OnTextUpdatedが読めるのか

f:id:bibinbaleo:20180916202719p:plain

 

 

ただこれはきちんと取得できました。

Update(){

Keyboard.Instance.OnTextUpdated += KeyboardOnTextUpdated;

}

private void KeyboardOnTextUpdated(string s)
{
valuetext.text = s;

}

 こうすると、キーボードを入力したら入力した文字がテキストに表示されました!

しかし1文字ずつではなく、累積していく。

abcって入力したらabcって表示される。

本当はbを入力したらaが消えてbだけ表示してほしい。

 

valueに入った文字を OnTextUpdatedが積み上げてるのかな?

f:id:bibinbaleo:20180916191105p:plain

とりあえずこれをタイピングゲーム側の判定に持ってくるには・・・

タイピングゲーム側のスクリプト

タイピングゲーム側のスクリプトはこちらの方のものを使っています。

qiita.com

キーを読み込むのはこのスクリプトです。

https://github.com/icoico/TypingGameSystemForUnity/blob/master/sample/TypeObject.cs

f:id:bibinbaleo:20180916200108p:plain

もともとパソコンの物理キーボードのタイピングゲーム用のスクリプトなのでGetKeyDownでキー入力を取得して、

if (ts.InputKey(key) == 1)

でtsというスクリプトのinputKey()という関数に入った次に入力すべき文字とInputしたkeyがおんなじだったらtrueになるという判定だと思います。

ということで

private void KeyboardOnTextUpdated(string s)
{


if( ts.InputKey(s) == 1)
{
UpdateText();
seikaisu++;
}

}

としたらタイピングゲーム側が入力認識した!!!!

f:id:bibinbaleo:20180916202213p:plain

がしかし、相変わらず入力した文字を入れる変数は累積?なんていうの?複数文字どんどんたまっていくタイプなので、1文字入れて認識されたらその1文字を消して、次の1文字を入力しないと進まない。

つまり

private void KeyboardOnTextUpdated(string s){}

で取得しているstring Sを1文字ずつにしないといけない。

どれ?????

やはりvalueという変数なのか?

f:id:bibinbaleo:20180916191105p:plain

valueをください

多分絶対valueに入ってると思う。

f:id:bibinbaleo:20180916203322p:plain

Textで表示させたところやっぱり入ってました。explosionの下の1文字だけのh

f:id:bibinbaleo:20180916211028p:plain

冷静に考えろ。いつもやってるみたいにpublicでグローバル変数にしたらいいだけだ。

public String value2;を最初のほうに書いて、

f:id:bibinbaleo:20180916212555p:plain

そしてタイピングゲーム側でこう!

f:id:bibinbaleo:20180916213105p:plain

できた!!!

ちゃんと1文字ずつ取れた。

ただ常に判定しているからssなどと同じ文字が続くときは一気に入力されてしまう。

例えばballoonだっやらbalonでOKになってしまう。

 

もともとはこんな感じに、何かしらGetKeyDownがあった時に判定していた。

f:id:bibinbaleo:20180916213320p:plain

なのでVRのコントローラーでキーが押されたらというのを判定しないといけない。

if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))

これにした。厳密にはこれはトリガーが押されたらだから、キーを押さずにトリガーを引いたらキーを押したことになってしまう。

 

それはいいとしてこれをifにしたら

1文字遅れでしか認識されなくなった。。。意味が分からない

foreach

ところで foreach (string value2 in keys)って何?

f:id:bibinbaleo:20180916220526p:plain

www.sejuku.net

最後に

回り道したけど、一応できました。まだだけど