Unity C#でゲームを起動していない間の時間を計測する方法

rose IT

経過時間の計測から一歩進んで、ゲームを閉じていた時間を計測してみたいと思います。放置系とかでよくあるアレです。

スポンサーリンク

ゲームを閉じていた時間の計測

終了時刻の保存

//Unity C#
//時刻の代入用
DateTime dt;

void OnMouseDown()
{  
dt = DateTime.Now;
text.text = "計測開始";
PlayerPrefs.SetString("lastTime", dt.ToString());
PlayerPrefs.Save();
}
スプライトをクリックすると、現在時刻を文字列に変換したものがPlayerPrefsで保存され、
ゲームを閉じている間の時間 unity1
画面には計測を始めた旨表記が出ます。これを疑似的にゲームを終了したタイミングとします。

終了時刻のロード

//Unity C#
string dt3;

void Start()
{
//保存した文字列設定の終了時刻を取得
dt3 = PlayerPrefs.GetString("lastTime");
}
ゲーム開始時に、今度は保存した文字列を呼び出します。
//Unity C#
//StringをDateTimeに変換
dt = DateTime.Parse(dt3);
文字列StringをDateTime構造体に変換するには、DateTime.Parse関数を噛ませます。これで終了時刻が復元できました。
//Unity C#
TimeSpan dt2;

dt2 = DateTime.Now - dt;
text.text = "経過時間は" + dt2.ToString() + "です";
復元した時刻を現在日時から引き算し、経過時間を扱えるTimeSpan構造体に流し込みます。
あとはTimeSpanを文字列にしてTextに表示してやればいい、という寸法です。
ゲームを閉じている間の時間 unity2
実際に動かしてみます。計測開始した後一回テストプレイを終了し、
ゲームを閉じている間の時間 unity3
しばし放置して再度テストプレイしてみると、計測開始してからの時間が表示されます。

初回起動時の対応

ゲームを閉じている間の時間 unity4
注意事項として、初回の起動時やロードに失敗した場合、代入できるデータがないのでGetStringしたデータが0になります。
//Unity C#
dt3 = DateTime.Now.ToString();
//保存した文字列設定の終了時刻を取得
dt3 = PlayerPrefs.GetString("lastTime");
GetStringする前に一回現在時刻を代入してしまう(ロードできるデータがない場合そのまま使われる)ことで解決できますが、
ゲームを閉じている間の時間 unity5
引き算するまでにかかった時間差が一応代入されはします。
//Unity C#
//保存した文字列設定の終了時刻を取得
dt3 = PlayerPrefs.GetString("lastTime");
if (dt3 == null)
{
dt3 = DateTime.Now.ToString();
}
データがnullの場合は現在時刻を代入、という方法でも対応できます。

日をまたいだ場合はどうなるか

ゲームを閉じている間の時間 unity6
ところで、TimeSpanを表示するとDateTimeにはあった年月日が消えます。
もし一日以上放置するとどうなるのでしょうか。
//Unity C#
void OnMouseDown()
{
dt = DateTime.Now;
//現在日時を10日前にする
dt2 = new TimeSpan(-240, 0, 0);
dt = dt + dt2;
text.text = "計測開始";
PlayerPrefs.SetString("lastTime", dt.ToString());
PlayerPrefs.Save();
}
というわけで、OnMouseDownで取得した現在日時に対し、TimeSpanを使って時間を240減らす=10日前にしてみます。
ゲームを閉じている間の時間 unity1
この状態で計測開始して、
ゲームを閉じている間の時間 unity7
再度開くと、時間の前に10.と表示がつきます。これが経過した日数にあたり、ちゃんと計測されることがわかります。
ゲームを閉じている間の時間 unity8
24000時間遡らせるとこうなります。年、月換算はされません。

時間を秒換算する

//Unity C#
double dt4;

dt2 = DateTime.Now - dt;
dt4 = dt2.TotalSeconds;
text.text = "経過時間は" + dt4.ToString() + "秒です";
取得した時間を秒数に換算するには、TimeSpanに対してTotalSecondsを付けてやればOKです。
ゲームを閉じている間の時間 unity9
実行結果です(10日放置した場合。60×60×24×10=864000)。
//Unity C#
using UnityEngine.UI;
using System;

public class GetTime : MonoBehaviour
{
    public Text text;
    //時刻の代入用
    DateTime dt;
    TimeSpan dt2;
    string dt3;
    //秒数表示しないなら不要
    double dt4;

    void Start()
    {
        //保存した文字列設定の終了時刻をStringで取得
        dt3 = PlayerPrefs.GetString("lastTime");
        if (dt3 == null)
        {
            dt3 = DateTime.Now.ToString();
        }

        //String→DateTime→TimeSpan→doubleに変換
        dt = DateTime.Parse(dt3);
        dt2 = DateTime.Now - dt;
      //秒数表示しないなら不要
        dt4 = dt2.TotalSeconds;
      //秒数表示しないなら「"経過時間は" + dt2 + "秒です";」に差し替え
        text.text = "経過時間は" + dt4.ToString() + "秒です";
    }

    void OnMouseDown()
    {
        dt = DateTime.Now;
        text.text = "計測開始";
        PlayerPrefs.SetString("lastTime", dt.ToString());
        PlayerPrefs.Save();
    }
}

やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。

コメント