モノ創りで国造りを

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

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

HIITトレーニング用のタイマーの作成です。
次はボタンを配置して、トレーニングの開始と停止を行えるようにします。
Hierarcyウィンドウで "右クリック" > "UI" > "Button" を選択し
Sceneビューにボタンを配置します。

ボタンを押した際のイベントをスクリプトで記載します。
今回は ボタンが押されていない初期状態では
 =>スライダーによるトレーニング時間の設定が可能で
ボタンが押されたら  =>タイマーが動き出す
という実装を行います。
ボタンが押された事だけを他のオブジェクトに通知出来ればよいです。

public class buttonControl : MonoBehaviour {
    public bool isStart = false;

    public void ButtonPush() {
        isStart = !isStart;
    }
}

これでボタンを押すとisStartの0/1が反転するようになりました。
このスクリプトをHierarcyウィンドウのボタンオブジェクトにアタッチします。
ボタン押下時に、スクリプトに記載のButtonPushを実行させるためには
ボタンオブジェクトのインスペクターの"On Click ()"をいじる必要があります。
f:id:yuji2yuji:20180110084042p:plain
左上から順に
- RuntimeOnly
- buttonControl > ButtonPush
- ボタンオブジェクト名
を選択します。
インスペクターで設定するのは少し手間ですね。
スクリプトで設定できる方法がないか模索中です。

これでボタンを押すとisStartが反転するようになりました。
この"isStart"はpublic設定されているので、他のオブジェクトでも使用できます。
他のオブジェクトでisStartを読み取るのは、以下のコードを記述すればOKです。

bool getIsStart;
getIisStart = GameObject.Find("ボタンのオブジェクト名").GetComponent<ボタンのスクリプト名>().isStart;

複雑なプログラムの場合は
オブジェクト間の変数のやり取りはこんがらがるので
*別のスクリプトにまとめたほうがわかりやすいと思います。

これで、ボタンの押下を他のオブジェクトが認識できるようになったので
スクリプトにボタン押下による動作の変更を記述します。
まずはスライダー

void Update () {
        isStart = GameObject.Find("startButton").GetComponent<buttonControl>().isStart;
        if (!isStart) {
            trainTime = (int)(sliderTrain.value * 60);
            restTime = (int)(trainTime * sliderRest.value);
            Debug.Log("Train: " + trainTime + "秒");
            Debug.Log("Rest: " + restTime + "秒");
            GetComponent<Text>().text = "Training: " + trainTime + "秒" + "\n"
                                        + "Rest: " + restTime + "秒";
        }
    }

次にテキスト表示

void Update() {
        isStart = GameObject.Find("startButton").GetComponent<buttonControl>().isStart;
        trainTime = (float)GameObject.Find("setTime").GetComponent<sliderControl>().trainTime;
        restTime = (float)GameObject.Find("setTime").GetComponent<sliderControl>().restTime;
        if (isStart) {
            counter += Time.deltaTime;
            dispCounter = (counter % (int)(trainTime + restTime)) % (int)trainTime;
            if ((counter % (int)(trainTime + restTime)) / (int)trainTime < 1) {
                isTraining = true;
                oneTimeRest = true;
            }
            else {
                isTraining = false;
                oneTimeTraining = true;
            }

            if (isTraining) {
                nowState = state[1];
                if (oneTimeTraining) {
                    menuNum = Random.Range(0, menu.Length);
                    nowTrain[0] = nowTrain[1];
                    nowTrain[1] = menu[menuNum];
                    oneTimeTraining = false;
                }
            }
            else {
                nowState = state[2];
                if (oneTimeRest) {
                    nowTrain[0] = "Rest";
                    oneTimeRest = false;
                }
            }
            setNum = (int)counter / (int)(trainTime + restTime) + 1;
            GetComponent<Text>().text = "Num: " + setNum.ToString() + "\n"
                                        + "Time: " + dispCounter.ToString("F2") + "\n"
                                        + "Now: " + nowTrain[0] + "\n"
                                        + "Next: " + nowTrain[1];
        }
        Debug.Log("isStart: " + isStart);

        if (!isStart) {
            counter = 0.0f;
        }
    }

これでひとまずは以下の仕様が満たされました。
- トレーニング時間を設定できる
- 休憩時間を設定できる
- トレーニングのスタートと停止を設定できる
- トレーニング内容がランダムに設定できる(モード選択はまだ)

次は"トレーニング内容を設定できる"を実装しようと思います。