どうも、ナッツパパです(^^)
本記事では、Time.deltaTimeについて解説していきます。
まずTimeとは、Unityが用意してくれている【UnityEngine】オブジェクトの中のTimeクラスのことです。
このTimeクラスには、Unityにおける様々な時間の情報が格納されています。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
上のコードの3行目で【UnityEngine】オブジェクトを呼び出していますね。
正確に書くと、UnityEngine.Time.deltaTimeとなりますが、Usingで呼びだすことで、UnityEngineは省略可能となっています。
僕は最初、このTimeクラスがどこからきているのか疑問だったので先に解説しておきました(^^)
それでは、早速Time.deltaTimeについてみていきましょう♪
Time.deltaTimeとは?
deltaTimeとは変数なので、Unityにおけるなんらかの時間の情報が格納されています。
ずばり、deltaTimeには次のフレームが表示されるまでの経過時間が格納されています。
▼Unityにおける【フレーム】の概念はこちらの記事で詳しく解説しています。
Unityのフレームレートは約60fps。
つまり、1秒間に60枚のフレームが生成されます。
ということは、1 ÷ 60 = 約0.02秒毎にフレームが生成されていることになりますね。
この約0.02秒こそが、deltaTimeに格納されている次のフレームが生成されるまでの経過時間にあたります。
これで、Time.deltaTimeにどの様な数値が格納されているのか理解して頂けたと思います。
▼そして、プラスアルファで、ここでしっかりおさえておきたいポイントを紹介します。
これがかなり重要で、PCのスペックや処理の負荷などによってこの時間は変動します。
▼以下は、この時間が変動するとどうなるのかが書かれているUnityマニュアルの一部を引用した文章です。
フレーム時間が一定でないので、オブジェクトは不規則な速度で移動するように見えます。フレーム時間が 10 ミリ秒なら、オブジェクトは 1 秒に distancePerFrame の距離を 100 回前進します。しかし、フレーム時間が 25 ミリ秒に増加した場合 (例えば CPU 負荷のため) 1 秒に 40 回しか前進できず、進む距離が少なくなります。
この文章では、1枚のフレーム生成にかかる時間が0.01秒のPCと、1
処理能力の高いPCだと1秒間に100m、低い方のPCで40mです。
同じゲームでも、PCのスペックによってこれほどまでにアニメーションが変わってくるということですね。
Time.deltaTimeの使い方
Time.deltaTimeを理解したところで、どういう時に使うのか分からなければ意味がありません。
▼基本的に使うタイミングは2つあります。
②Unity内で時間を計測する時
それぞれ見ていきましょう。
ゲームオブジェクトを動かす時
ゲームオブジェクトを右に動かす簡単なコードを例に解説していきます。
// Update is called once per frame void Update() { transform.position += new Vector3(1f,0f,0f); }
▼ここでも下の2つのPCで比較していきます。
1⃣処理能力の高いPC → 1秒間に60回フレームを生成する
2⃣処理能力の低いPC → 1秒間に40回フレームを生成する
1⃣のPCだとキャラクターは1秒間に60m進みます。
2⃣のPCだと40mですね。
この様に、PCのスペックが違うからってアニメーションに差がでるのは開発者からすると都合が悪いわけです。どんなデバイスでも公平な処理を行いたい。
これを実現してくれるのが、Time.deltaTimeです。
// Update is called once per frame void Update() { transform.position += new Vector3(1f * Time.deltaTime,0f,0f); }
先ほどのコードにTime.deltaTimeをかけています。
1⃣のPCの場合、Time.deltaTimeには1 ÷ 60 =0.016秒が格納されており、
2⃣のPCには1 ÷ 40 =0.025秒が格納されています。
ではそれぞれのPCで、キャラクターの移動距離を比較してみましょう。
1⃣は、1秒 * 0.016秒 * 60回 =約1m
2⃣は、1秒 * 0.025秒 * 40回 =約1m
今回は、PCのスペックが違っても移動距離が同じになりました。
これで、どのデバイスからでも公平な処理が実現できました♪
Unity内で時間を計測する時
これは、すごくシンプルです。
時間制限を設けたゲームを開発する時に、ゲームスタート時からの経過時間を表示したい時があります。そんな時にもTime.deltaTimeが活躍します。
float timer; void Update(){ timer += Time.deltaTime; }
これで、timer変数に次のフレームが表示されるまでの時間を加算し続けることが出来ます。
タイマーにもなるということですね(^^)
まとめ
Time.deltaTimeは、次のフレームが表示されるまでの経過時間が格納されている。
▼使い道
①デバイスのスペックの違いにより生まれる、ゲーム内キャラクターの動く速度を公平にする
②ゲーム内でのタイマーの役割を果たす
以上です。