経過時間の計測から一歩進んで、ゲームを閉じていた時間を計測してみたいと思います。放置系とかでよくあるアレです。
ゲームを閉じていた時間の計測
終了時刻の保存
前準備として、経過時間の計測で使ったセットをそのまま使います。
//Unity C#
//時刻の代入用
DateTime dt;
void OnMouseDown()
{
dt = DateTime.Now;
text.text = "計測開始";
PlayerPrefs.SetString("lastTime", dt.ToString());
PlayerPrefs.Save();
}
スプライトをクリックすると、現在時刻を文字列に変換したものがPlayerPrefsで保存され、
画面には計測を始めた旨表記が出ます。これを疑似的にゲームを終了したタイミングとします。
終了時刻のロード
//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に表示してやればいい、という寸法です。
あとはTimeSpanを文字列にしてTextに表示してやればいい、という寸法です。
実際に動かしてみます。計測開始した後一回テストプレイを終了し、
しばし放置して再度テストプレイしてみると、計測開始してからの時間が表示されます。
初回起動時の対応
注意事項として、初回の起動時やロードに失敗した場合、代入できるデータがないのでGetStringしたデータが0になります。
//Unity C#
dt3 = DateTime.Now.ToString();
//保存した文字列設定の終了時刻を取得
dt3 = PlayerPrefs.GetString("lastTime");
GetStringする前に一回現在時刻を代入してしまう(ロードできるデータがない場合そのまま使われる)ことで解決できますが、
引き算するまでにかかった時間差が一応代入されはします。
//Unity C#
//保存した文字列設定の終了時刻を取得
dt3 = PlayerPrefs.GetString("lastTime");
if (dt3 == null)
{
dt3 = DateTime.Now.ToString();
}
データがnullの場合は現在時刻を代入、という方法でも対応できます。
日をまたいだ場合はどうなるか
ところで、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日前にしてみます。
この状態で計測開始して、
再度開くと、時間の前に10.と表示がつきます。これが経過した日数にあたり、ちゃんと計測されることがわかります。
24000時間遡らせるとこうなります。年、月換算はされません。
時間を秒換算する
//Unity C#
double dt4;
dt2 = DateTime.Now - dt;
dt4 = dt2.TotalSeconds;
text.text = "経過時間は" + dt4.ToString() + "秒です";
取得した時間を秒数に換算するには、TimeSpanに対してTotalSecondsを付けてやればOKです。
実行結果です(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の時期に書き始めているので、それより前のバージョンについては言及しません。
コメント