【Unity】経過時間の取得

2020/2/6一部修正


2020年に入って、1カ月サボってしまいました(..*) オハズカシイ・・

年末から公開アプリを作り始めたのですが、
絵が作れない、ゲーム性がない、アイディアが足りない

そんな感じでテンションが下がってしまい、ズルズルと今日まで…才能ないな~(´`;)

このままでは終わってしまうので、
続ける為に無理やりお題を設けて、ブログを更新する事にしました。


今回のテーマは”時間”です。
ゲームの時間管理は、アクション系やパズル系でも多用するかと思います。

時間管理をするには、色々な方法があると思うので勉強してみます。

・Timeクラス
これが一番使われています。

フレームを利用した時間経過を測定するクラスで、
主にTime.TimeやTime.deltaTimeが使われます。

・DateTime構造体
現在時刻の取得ができます。
開始時間を取得して現時刻の差で取得できます。

・コルーチンで一定時間処理
例外的ですが、コルーチンでも処理はできるかと思います。

他にもありそうですが、現段階で理解しているのは、この辺りです。


早速、Timeクラスから使ってみたいと思います。
Time.time

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TimeManager : MonoBehaviour
{

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
Debug.Log(Time.time);
}
}

Time.timeはPLAY開始からの経過時間を取得できます。
シーンの切り替え時は、シーン開始からの時間が計測できます。

Time.deltaTime

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TimeManager : MonoBehaviour
{
private float time;

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
time += Time.deltaTime;

Debug.Log(time);
}
}

deltaTimeは、フレーム毎の時間計測ができます。

deltaTimeは、意見がいろいろで分かりにくいのですが、
単純にUpdateの呼び出し時間と捉えてもいいかと思います。

フレームレートは、端末の処理能力で変わるので、
deltaTimeでUpdateの時間を取得しておくと処理時間が把握できます。

処理時間を計測する場合は、Update毎の秒数なので加算する必要があります。


最初からの経過時間ならTime.time
途中からの経過時間(スタートボタンを押したなど)ならTime.deltaTime

で使い分けできそうです。


DateTime

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TimeManager : MonoBehaviour
{
private DateTime starttime;

// Start is called before the first frame update
void Start()
{
starttime = DateTime.UtcNow;
}

// Update is called once per frame
void Update()
{
Debug.Log(DateTime.UtcNow-starttime);
}
}


DateTimeを使う場合は、ネームスペースにSystemを宣言します。
これは単純に開始時刻と現時刻の差を割り出しているだけです。

Time.timeと似ていますが、開始時間の取得位置によって、
途中からの時間経過も計測できます。

時間経過を読み取るには、使い回しが面倒かも…

コルーチン

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class TimeManager : MonoBehaviour
{
private float time;

IEnumerator Start()
{
while (true)
{
time += 0.1f;
Debug.Log(time);
yield return new WaitForSeconds(0.1f);
}
}
}

もはや意味が無い状態ですね~
時間の刻みはできますが実用するには??

タイマーとしては、使えない…

経過時間取得の方法を試してみました。

時間管理は、結構使う事があるので参考にして頂けると幸いでっす。


記事を書き終わった後にstopwatchクラスを思い出しました。
以前、記事にも上げたのに忘れるとは (;^o^) \(ToT )あんたほんとにそれでいいの
 
これは、内部処理時間の計測に使うのですが、
経過時間も読む事ができます。

ゲーム内でのタイマーとしては、使いにくいかも…



次回は、時間経過を利用した物を作ってみたいと思います。
今回はこのへんで (^.^/)))~~~bye!!

この記事へのコメント