MRTKのキーボードで入力した値を取得して、前に作ったタイピングゲームを動かしたいです。(OculusGoで動かすよ!)
OculusGoにMRTKのキーボードを入れて入力をして、キーボードについている入力画面に文字が表示されるところまでは以前やりました。
以下私にしかわからないかもしれない。
MRTKのどこに文字はいってるんや
MRTKのキーボードをクリックしたらどの変数にその文字は入っているのか
MRTKの分析記事を書いてくださっているこちらの記事によれば↓
/Knowledge/Programming/Unity/MRTK.UX.Keyboard メモ
UnityEngine.UI.Button のクリックイベントが発火すると,Keyboard の AppendValue(...)
メソッドが呼ばれ,InputField の text が更新される.
とあります。
Keyboardスクリプトはキーボードプレハブの一番上にあります。
ここのどれかに入っているのか?
もう一つこの記事
この記事ではテキストをこんな感じで取得している
using HoloToolkit.UI.Keyboard;
using HoloToolkit.Unity.InputModule;
これを入れるとエラーが一部消えた。
ところでこのスクリプトは、どうやって文字を取得しているの?
Keyboard.Instance.OnTextUpdated += KeyboardOnTextUpdated;
これの意味って?
KeyboardのOnTextUpdateをどうにかこうにかしているの?
punlicだからほかのスクリプトから OnTextUpdatedが読めるのか
ただこれはきちんと取得できました。
Update(){
Keyboard.Instance.OnTextUpdated += KeyboardOnTextUpdated;
}
private void KeyboardOnTextUpdated(string s)
{
valuetext.text = s;}
こうすると、キーボードを入力したら入力した文字がテキストに表示されました!
しかし1文字ずつではなく、累積していく。
abcって入力したらabcって表示される。
本当はbを入力したらaが消えてbだけ表示してほしい。
valueに入った文字を OnTextUpdatedが積み上げてるのかな?
とりあえずこれをタイピングゲーム側の判定に持ってくるには・・・
タイピングゲーム側のスクリプト
タイピングゲーム側のスクリプトはこちらの方のものを使っています。
キーを読み込むのはこのスクリプトです。
https://github.com/icoico/TypingGameSystemForUnity/blob/master/sample/TypeObject.cs
もともとパソコンの物理キーボードのタイピングゲーム用のスクリプトなのでGetKeyDownでキー入力を取得して、
if (ts.InputKey(key) == 1)
でtsというスクリプトのinputKey()という関数に入った次に入力すべき文字とInputしたkeyがおんなじだったらtrueになるという判定だと思います。
ということで
private void KeyboardOnTextUpdated(string s)
{
if( ts.InputKey(s) == 1)
{
UpdateText();
seikaisu++;
}
}
としたらタイピングゲーム側が入力認識した!!!!
がしかし、相変わらず入力した文字を入れる変数は累積?なんていうの?複数文字どんどんたまっていくタイプなので、1文字入れて認識されたらその1文字を消して、次の1文字を入力しないと進まない。
つまり
private void KeyboardOnTextUpdated(string s){}
で取得しているstring Sを1文字ずつにしないといけない。
どれ?????
やはりvalueという変数なのか?
valueをください
多分絶対valueに入ってると思う。
Textで表示させたところやっぱり入ってました。explosionの下の1文字だけのh
冷静に考えろ。いつもやってるみたいにpublicでグローバル変数にしたらいいだけだ。
public String value2;を最初のほうに書いて、
そしてタイピングゲーム側でこう!
できた!!!
ちゃんと1文字ずつ取れた。
ただ常に判定しているからssなどと同じ文字が続くときは一気に入力されてしまう。
例えばballoonだっやらbalonでOKになってしまう。
もともとはこんな感じに、何かしらGetKeyDownがあった時に判定していた。
なのでVRのコントローラーでキーが押されたらというのを判定しないといけない。
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
これにした。厳密にはこれはトリガーが押されたらだから、キーを押さずにトリガーを引いたらキーを押したことになってしまう。
それはいいとしてこれをifにしたら
1文字遅れでしか認識されなくなった。。。意味が分からない
foreach
ところで foreach (string value2 in keys)って何?
最後に
回り道したけど、一応できました。まだだけど