モノ創りで国造りを

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

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

2018年の抱負として体を鍛える事にしました。
効率のよい筋トレ方法を探した結果、HIITなるものを見つけました。
HIITとは
High Intensity Interval Training(高強度インターバルトレーニング)
の頭文字をとったもの。
例えばHIITで最も一般的なTABATAメソッドは
"20秒間高負荷な筋トレをして10秒休む"を8セット繰り返すトレーニングです。
8セットを トレーニング時間はわずか4分ですが、脂肪燃焼効果はランニングの50分に相当するらしい・・・
ほんまかいな??

過去にお腹が6つに分かれる事を夢見て何度か筋トレにチャレンジしましたが、
ルクアップはできても脂肪は燃焼せず
AV男優みたいな体になるという結果しか得られませんでした。
そんなこともあり、今年の筋トレには脂肪燃焼効果が極めて高い(ほんまかいな?)HIITを採用。

早速インターバルトレーニング用のタイマーアプリを探しましたが
タイマーごときで有料だったり、 無料でも機能制限していたりと
ひどい世の中だぜという事で
勉強もかねてUnityで作ってみることにしました。

仕様はこんな感じ
-トレーニング時間が設定できる(デフォルト20秒)
-休憩時間が設定できる (デフォルト10秒)
-セット数を設定できる(デフォルト8回)
-セット間の休憩時間が設定できる(デフォルト60秒)
-タップするとタイマーが停止、再生する
-トレーニング<=>休憩遷移時にバイブが鳴る
-トレーニング内容を自分で設定できるモードがある
-トレーニング内容をランダムで決めてくれるモードがある

初めから全部の機能を盛り込むのは今の自分には難しいので
ひとまず以下の仕様で、ひな形となるプログラムを作ってみた。
-トレーニング中か休憩中かが表示される
-一定時間トレーニングでその後一定時間休憩
-トレーニング内容がランダムでセットされる
-次のトレーニング内容が表示される

単純な仕様だけど、実装するには結構な時間を要しました。

public class countTimer : MonoBehaviour {
    float counter = 0.0f;
    float dispCounter;
    int setNumOld = 0;
    int menuNum;
    bool isTraining = false;
    float trainTime = 10.0f;
    float restTime = 5.0f;
    int setNum = 0;
    bool oneTimeTraining = false;
    bool oneTimeRest = false;
    string[] state = {"Prepare","Training","Rest"};
    string nowState;
    string[] nowTrain = {" "," "};
    string[] menu = {   "プッシュアップ", "ジャンピングランジ", "バーピージャンプ",
                        "リバースプッシュアップ", "レッグレイズ", "ブリッジプッシュアップ",
                        "スパイダーマンプッシュアップ", "スーパーマンエクステンション"};
    // Use this for initialization
    void Start () {
        isTraining = true;
        for (int i = 0; i < 2; i++) {
            menuNum = Random.Range(0, menu.Length);
            nowTrain[i] = menu[menuNum];

        }
    }
    
    // Update is called once per frame
    void Update () {
        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 = nowState + "\n" + "Num: " + setNum.ToString() + "\n"
                                    + "Time: " + dispCounter.ToString("F2") + "\n"
                                    + "Now: " + nowTrain[0] + "\n" + "Next: " + nowTrain[1];
    }
}

ここから、シーンの変更とか
モード変更とか
時間の設定とか
おしゃれなUIとか
色々やることがある
作るの面倒なのでお金払おうかな・・・