Time.deltaTimeプロパティの考え方

2023年3月8日

Unityのコードを見ていると、Update()の中でTime.deltaTimeを掛けているケースが多くあります。
これは一体何をしているのでしょうか?

ゲーム画面が表示される仕組み

画面が変わっていくのは、一定時間ごとにフレームを入れ替える(変更)するためです

フレームレート

フレームレート(Frame Rate)とは、動画や映像の再生時に、1秒間に表示される静止画の数を表す数値のことです。フレームレートは、単位時間あたりに表示される静止画の数を表すので、「fps(frames per second)」という単位で表されます。

例えば、フレームレートが30fpsであれば、1秒間に30枚の静止画が表示されることになります。一般的に、フレームレートが高いほど、映像がスムーズになりますが、それに対して必要な処理能力やデータ量が増加するため、コンピュータや映像処理機器などの性能に合わせて適切なフレームレートを選択する必要があります。

Time.deltaTime

Time.deltaTimeは、Unity(ユニティ)ゲームエンジンで使われる変数のひとつで、直前のフレームの完了から次のフレームの完了までにかかった時間を表します。

具体的には、Time.deltaTimeは秒単位で、前回のフレームと現在のフレームの間の時間の差分を表します。これにより、フレームレートによって実行速度が異なる場合でも、ゲームオブジェクトやアニメーションの動きが滑らかになります。

例えば、フレームレートが60fpsであれば、1秒間に60回のフレームが実行されます。この場合、Time.deltaTimeの値はおおよそ0.0167秒(1秒÷60フレーム)になります。

Time.deltaTimeは、物理シミュレーションやアニメーションなど、実行速度が一定でなければならない場合に非常に有用な変数です。

10fpsの場合のフレーム

10fpsの場合のTime.deltaTome

【10fps】1m/sの速度でキャラクタを進める時、1枚あたりどれくらい進めばいい?

【100fps】1m/sの速度でキャラクタを進める時、1枚あたりどれくらい進めばいい?

フレームレートが変わっても速度を一定にするには・・・

公式

次のコードをUpdate()メソッドに記述すればいいです

設定したい速度とは、どのようなパフォーマンスのPCでも統一した速度になります

フレームあたりの移動距離 = 設定したい速度 × Time.deltaTime

具体的なコード

using UnityEngine;

public class Car2Controller : MonoBehaviour
{
    void Update()
    {
        transform.Translate(1 * Time.deltaTime, 0, 0);
    }
}

このコードは、Unityのゲームオブジェクトを制御するためのC#スクリプトの一部です。具体的には、Car2Controllerという名前のクラスを定義し、そのオブジェクトが移動する方法を指定しています。

このスクリプトでは、Update()メソッドが定義されており、これは毎フレーム実行されます。Update()メソッド内で、transform.Translate()メソッドが呼び出されています。これは、オブジェクトの座標を変更するために使用されます。具体的には、この行のコードでは、オブジェクトをx軸方向に1秒間にTime.deltaTimeの量だけ移動させています。Time.deltaTimeは、前回のフレームから現在のフレームまでの時間の差を表します。これは、ゲームが異なるプラットフォームで実行される場合でも、一定の速度で動くようにするために使用されます。

つまり、このスクリプトは、Car2Controllerクラスがアタッチされたオブジェクトを、毎フレームx軸方向に一定の速度で移動させるために使用されます。

効果を確かめる

実際にTime.deltaTimeの効果を確かめるプロジェクトを作成してみましょう

実行結果

キーボードの「1」を押下すると20fpsになり、「2」を押下すると60fpsになります

上の車(Car1)は、Updateメソッドに移動コードを記述しただけ
下の車(Car2)は、Time.deltaTimeでフレームレートの違いを吸収したものになります

シーン構成

Car1

Car2

GameObject

スクリプト

Manager


using UnityEngine;

public class Manager : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            Application.targetFrameRate = 20;
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            Application.targetFrameRate = 60;
        }
    }
}

このコードは、Unityのゲームオブジェクト上で動作するスクリプトで、フレームレートを制御するためのものです。

スクリプトは、Update()メソッド内でフレームレートを設定するためのコードを提供しています。具体的には、Input.GetKeyDown()メソッドを使用して、キーボードからの入力を監視し、特定のキーが押された場合にApplication.targetFrameRateを設定しています。

Input.GetKeyDown()メソッドは、指定したキーが押された瞬間にtrueを返すため、このスクリプトは常にキーボードの入力を監視しています。

このスクリプトでは、Alpha1キーが押された場合、Application.targetFrameRateは20に設定されます。同様に、Alpha2キーが押された場合、Application.targetFrameRateは60に設定されます。Application.targetFrameRateは、フレームレートの目標値を設定するために使用されます。Unityがこの値に従って、フレームレートを制御します。

つまり、このスクリプトは、ユーザーがキーを押すことで、ゲームのフレームレートを変更することができるようにしています。

Car1Controller

using UnityEngine;

public class Car1Controller : MonoBehaviour
{
    void Update()
    {
        transform.Translate(1 / 20.0f, 0, 0);
    }
}

このコードは、Unityのゲームオブジェクトのスクリプトとして、車を制御するためのものです。

using UnityEngine; は、Unityで使用される基本的なクラスやメソッドを使用するために必要な名前空間をインポートしています。

public class Car1Controller : MonoBehaviour は、Car1Controller という名前のクラスを定義しています。MonoBehaviour クラスを継承しているため、このスクリプトはUnityのオブジェクトにアタッチされ、更新などのイベントに対してコードを実行することができます。

void Update() メソッドは、毎フレームごとに呼び出されるメソッドです。そのため、車を移動するためのコードはこのメソッドの中に書かれています。

transform.Translate(1 / 20.0f, 0, 0) は、車のTransformコンポーネントを使って、車をx軸方向に移動させるコードです。Translate メソッドは、現在のオブジェクトの位置を引数で指定した距離だけ移動します。第1引数はx軸方向の移動距離で、 1 / 20.0f は 1/20 の小数点表記であり、車を毎フレームごとに1/20ずつx軸方向に移動させることを意味しています。2番目と3番目の引数はy軸方向とz軸方向の移動距離を表しており、この場合は0に設定されています。

Car2Controller

using UnityEngine;

public class Car2Controller : MonoBehaviour
{
    void Update()
    {
        transform.Translate(1 * Time.deltaTime, 0, 0);
    }
}

このコードは、Unityゲームエンジンで作成された車のコントローラースクリプトです。このスクリプトは、Update()関数が毎フレーム呼び出され、車を1ユニット/秒の速度で水平に移動します。

具体的には、transformはスクリプトがアタッチされたオブジェクトのTransformコンポーネントを参照し、Translate()関数は、Transformコンポーネントを使用してオブジェクトを移動させるために使用されます。このスクリプトでは、Translate()関数は、オブジェクトをx軸方向に1 * Time.deltaTimeの速度で移動させます。

Time.deltaTimeは、前のフレームからの経過時間を表すフロート値で、フレームレートに依存しないようにするために使用されます。これにより、異なるフレームレートの環境でも、移動速度が一定に保たれます。

このスクリプトは、車を常に同じ速度で移動させるために非常に役立ちます。

Unity

Posted by hidepon