モノ創りで国造りを

ハード/ソフト問わず知見をまとめてます

HIITトレーニング用のタイマーを自作する part4

HIITトレーニング用のタイマー自作中です。
今回は、メニューを設定する方法を調査しました。
具体的には
- テキストでトレーニングメニューをいくつか入力する
- 入力されたトレーニングメニューがランダムで表示される
といった感じです。

結果
こんな感じで、入力したテキストがトレーニングメニューに表示されるようになりました。
f:id:yuji2yuji:20180111212623p:plain

入力したテキストのうち1つがランダムでNextに設定され
時間がたてばNowに表示されます。

実装方法はわかってしまえばとても簡単でした。

Hierarchyウィンドウで "右クリック" > "UI" > "InputField"を選択
これでテキスト欄ができます。
このInputFieldに入力されたテキストを拾い、
トレーニングメニューに表示させれば、
今回の仕様はほぼ満たしたことになります。

まずはスクリプトで以下を記述します
''' public class inputFieldControl : MonoBehaviour {

public string str;
public InputField inputField;

public void SaveText() {
    str = inputField.text;
}
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}

} '''
これは、SaveText関数が呼ばれたら、"str"に"InputField"のテキストを代入するという事を示しています。
ではSaveText関数をいつ呼ぶのかをUnityに認識させます。
このスクリプトをInputFieldオブジェクトにアタッチし、
インスペクターの"On End Edit (String)"欄をいじります。
[f:id:yuji2yuji:20180111213529p:plain]
左上から順に
- Runtime Only
- スクリプト名.SaveText - InputFieldオブジェクト
を選択します。
これでInputFieldに文字を入力完了した際に
SaveText関数が呼ばれるようになります。
つまりstrにテキストが代入されるようになります。

あとはトレーニングメニューにstrを呼び出せばOKです。
そのためには、以下のコードをタイマーのスクリプトに追加します。

menu[0] = GameObject.Find("InputField").GetComponent<inputFieldControl>().str;

とても簡単ですね。

しかし、これではトレーニングメニューが1つしか選択できません。
今回はメニューを8つにしたいです。
こういった場合、Unityではprefabを作成することで
同じ特性のオブジェクトを量産できます。

HierarchyウィンドウのInputFieldオブジェクトをAssetウィンドウに
ドラッグアンドドロップします。
これでInputFieldのprefabが出来ました。

あとはこのprefabをsceneビューにドラッグアンドペーストすると
オブジェクトが勝手に生成されます。
便利ですね。

ここでは8つオブジェクトを生成し
それぞれの名称をInputField0からInputField7にしておきます。

そうすることで、以下のコードによって
8つのトレーニングメニューをランダムに選択してくれるようになります。

for(int i=0; i < 8; i++) {
                menu[i] = GameObject.Find("InputField"+ i).GetComponent<inputFieldControl>().str;
            }

これで今回の目的は達成できました。
めでたしめでたし。

次はトレーニングと休憩の切り替え時にバイブが鳴るようにしたいと思います。