クリアメモリ

プログラミングやモーショングラフィックス、便利なアプリケーションなど雑多に記録するブログ

【Unity】ストップウォッチで時間を計るスクリプト|動画あり

f:id:clrmemory:20170422164336p:plain 

Unityでアプリを作っていると「時間制限」や「クリアタイム」などを実装すると思います。そのような時に使える「時間を計る方法」を紹介します。

 

今回の方法は、使い方によっては「時計」を作ったり、「ストップウォッチ」を作る時などに使えます。

動画を合わせて貼り付けているので、確認しておくと動作がわかりやすくなるかもしれません。

 

 

はじめに

 

今回作成した「ストップウォッチ」は以下のような画像を作成しました。

Watch Sozai

この画像に、Unity側でテキストを表示しています。スタートやストップの処理は作成していないので、時間が増えていく処理のみ追加しました。

 

動画を作成しているので、もしよろしければ見てみてください。

 

オブジェクトを配置しよう

 

まず「分」「秒」「少数以下」「:」「 . 」のテキスト、「カメラ」「ストップウォッチの画像」などのオブジェクトを配置します。

テキスト類は子オブジェクトとして配置しておくと、まとめて移動できるので便利です。詳しくは以下の画像を参考にしてください。

 

スクリーンショット 2015-12-31 6.06.40

 

ストップウォッチの液晶部分に時間のテキストを配置してください。

(ストップウォッチの画像は使用しなくても今回の処理は作成できます。)

 

続いて、TextMeshを設定していきましょう。

 

テキストを設定する

 

先ほど配置した「分」「秒」「少数」テキストの「Anchor」を変更します。

スクリーンショット 2015-12-31 6.11.39

 

それぞれのテキストのAnchorを「○○ right」に変更してください。

(Upper、Middle、Lowerはどれでも大丈夫です)

 

ここでrightにした理由は「数字がずれてしまう」という理由があります。

詳しくは「テキストの中心点を変える方法」という記事を書いていますので、時間がある時にでも見てください。

 

https://clrmemory.com/unity/text-center-change/

 

 

ではストップウォッチのコードを書いていきましょう。

 

コードを書いてみよう

 

まずストップウォッチに使うコードを紹介し、その後コードの説明をしていきます。以下を参考にして、スクリプトを作成してください。

using UnityEngine;
using System.Collections;

public class Timer : MonoBehaviour {

    TextMesh Min;
    TextMesh Sec;
    TextMesh Decimal;

    public float timeCount = 0;
        public float DecCount;

    public int MinCount;
    public int SecCount;
    // Use this for initialization
    void Start () {
        Min = GameObject.Find ("Min").GetComponent ();
        Sec = GameObject.Find ("Sec").GetComponent ();
        Decimal = GameObject.Find ("Decimal").GetComponent ();
    }
    // Update is called once per frame
    void Update () {

        timeCount += 1.0f * Time.deltaTime;
        DecCount = timeCount * 100;

        if (timeCount >= 0.98) {
            timeCount = 0;
            SecCount = SecCount + 1;
        } else if (SecCount >= 60) {
            SecCount = 0;
            MinCount = MinCount + 1;
        }

        if (MinCount < 10) {
            Min.text = string.Format ("0{0}", MinCount.ToString ());
        } else {
            Min.text = string.Format ("{0}", MinCount.ToString ());
        }
        if (SecCount < 10) {
            Sec.text = string.Format ("0{0}", SecCount.ToString ());
        } else {
            Sec.text = string.Format ("{0}", SecCount.ToString ());
        }
        if (DecCount >= 0 && DecCount < 9.9) {
            Decimal.text = string.Format ("0{0}", DecCount.ToString ("f0"));
        } else if (DecCount < 99.9) {
            Decimal.text = string.Format ("{0}", DecCount.ToString ("f0"));
        }
    }
}

 

では説明していきます。

テキストのオブジェクト

まず、「Min」「Sec」「Decimal」でそれぞれテキストを取得しています。

「Min」が「分」、「Sec」が「秒」、「Decimal」が「少数」というようにしました。

 

時間を計るオブジェクト

timeCount

-> 時間を計る

MinCount

-> 何分かを計る

SecCount

-> 何秒かを計る

DecCount

-> 少数を計る

 

Start( ){}

Min、Sec、Decimalのオブジェクトを取得しています。

 

timeCount += 1.0f * Time.deltaTime;

-> 1秒毎に 1.0追加されていきます。

 

DecCount = timeCount * 100;

-> DecCount が先ほど計った時間です。timeCount * 100をしている理由は後述します

 

if(timeCount >= 0.98){}

時間が1秒になったら「timeCount」を初期化しながら「SecCount」に1追加します。

0.98になっているのは「1秒になると同時に0へ戻すためです。」

 

if(SecCount >= 60){}

秒数が60秒になったら0に戻し、「分」に1追加しています。

 

if(MinCount < 10){} 

「分」の数が10より低かった場合は「01」「02」というように「0○」となるようにしました。

「秒」「少数」の場合も同様なので、省略。

 

ToString( )

DecCountのToString( ) だけ他2つのコードと違っています。

これは「小数点以下の数値を制限する」というものです。"f○"というように書くことで○桁までに制限するという使い方ができます。

 

なぜtimeCount * 100なのか

 

先ほど後述すると言っていた「DecCount = timeCount * 100」について説明します。

まず、DecCountは小数点です。もしDecCountの値をstring型で表示してしまうと、「0.○○」という値が入力されてしまいます。

 

そこで100かけることで小数点以下の2桁までを整数にすることができました。

これで「○○」の部分が、少数に表示されるというわけです。

 

確認

 

実際に確認してみてください。

00:00.00 に時間が指定されていたら成功です。

 

スクリーンショット 2015-12-31 7.01.17

 

まとめ

 

今回作成したストップウォッチのコードを応用すれば、時間制限やクリアタイムを実装することができます。

他にも、string型に値を代入する方法を使えば、テキストをコードから変更することができます。

 

ぜひ活用してみてください。ではまた。

 

新着記事