Time.deltaTimeとは何か。 #Unity

移動やローテーションなどのサンプルコードなどで、値にTime.deltaTimeを掛けていることがよくあると思います。
何なんだこれはとリファレンスを見てみると、

Time.deltaTime には、前のフレームと今のフレームの時間的な差分が格納されています(単位は秒です)。

と書いてありますが、ゲーム制作経験者は除いて、この説明でいきなりピンとくる方はいないかと思います。

厳密な挙動はいたるところで説明してるので任せておいて、ここでは超噛み砕いた説明をします

Time.deltaTimeは1秒当たりに5メートルの速度で動かしたい!
1秒当たり30度の角速度でローテーションさせたい!
という時に使います

たとえば、

function Update () {
    transform.position.x += 1;
}

とコードを書いたら、これ、1秒当たり何m進むと思いますか?(1m=1Unity単位とします)
答えは、「わからない」です。なぜならUpdate()関数は1秒当たり何回呼び出されるかというのは定義されておらず、実行環境や処理能力によって変動するからです。
なので、1秒間に130回呼び出されるPC環境だと130m進みますし、60回のPC環境ですと60mです。たとえばこれがレースゲームだった場合、PC環境によって車の速度が変わるゲームなんて前代未聞です。

これじゃ困るって時に、

function Update () {
    transform.position.x += 1 * Time.deltaTime;
}

とかけてあげます。今度は何が起こるかというと、1秒当たり何回Updateが呼び出されようが、1秒当たり1m進むようになります。環境に依存しなくなるわけです。
原理は、たとえば1秒当たり130回UpdateするPCだったら、
Time.deltaTimeは1/130です。これで130回呼び出されるわけですから、1秒あたりの加算合計が1mになります。
同様に、仮に60回UpdateするPCだったらTime.deltaTimeは1/60です。これが秒間60回呼び出されるので、加算合計は同様に1mになります。
(厳密には違いますが、まずはこういう考え方が良いと思います)

なので、
(1秒当たりに移動、回転させたい値)* Time.deltaTime
とすると、きれいで厳格に物の速度を決定することができます。

Pocket

One response on “Time.deltaTimeとは何か。 #Unity

  1. Pingback: three.jsの実行速度 | futu-no

コメントを残す