UnityのTime.deltaTimeとは何かを理解する。初心者のUnity講座

こんにちは!

子供向けプログラミング教室kobakスタッフです!

最近Unityを学びたい!という大人が増えていますが、

Unityを学習したい子供も増えていますね。

早い子だと小学校5年生くらいからUnityを勉強していて、すごい時代だなぁと思ったりします。

さて、Unityを学習し始めると、よく目にするのが

Time.deltaTime

です。

初心者の方も、Time.deltaTimeがなぜ必要なのか、いつ必要なのか、よくわからん!

という人が多いように思います。(僕もそうでした)

Time.deltaTimeはいつ必要か

なぜ必要かというか、いつ必要かから話してみたいと思います。

キャラクターを動かすとき

キャラクターを動かすとき、こんなコードを書いたりすると思います。

transform.position = transform.position + new Vector3(1, 0, 0);

このプログラムは、簡単に言えば、キャラクターを右に移動するプログラムです。

new Vector3(1, 0, 0)が移動方向、つまりベクトルを示すわけです。

上記でも動作はしますが、正確には、

transform.position = transform.position + new Vector3(1, 0, 0) * Time.deltaTime;

とし、

移動方向のベクトルに対して、Time.deltaTimeを掛け算してあげるのがお約束です。

時間を計測するとき

時間制限のステージなどを作るとき、ゲームスタートから何秒経過したかを計算する場面が多くあります。

そんなとき、こんなコードになるかと思います。

float timer;
void Update(){
  timer += Time.deltaTime;
}

Updateでtimer変数をTime.deltaTimeずつ増やしています。

よくわからないけど、時間を計測するというサンプルコードを見ながら、

なんとなくTime.deltaTimeを使っている初心者も多いんじゃないでしょうか。

Time.deltaTimeとは何か

Time.deltaTimeには、

前回のUpdateから何秒経過しているか、

の値が入っています。

例えば、60FPS、1秒間に60回Updateが実行される環境では、

概ね、0.016666….という値が入っていることでしょう。

Time.deltaTimeは毎回変わる

Time.deltaTimeは毎回変わります。

重い処理が入れば、それだけ実行に時間がかかり、次のUpdateまで時間を要します。

試しに以下のコードを実行してみましょう。

ログにバラバラの時間が記録されるはずです。

void Update(){
  Debug.Log(Time.deltaTime);
}

Time.deltaTimeがなぜ必要か

Time.deltaTimeはなぜ必要か。

それは実行している環境によって、処理速度が違うからです。

例えば、パソコンとスマフォでは処理能力が違いますし、新しいPCと古いPCでも処理能力が違います。

1秒間に60回実行できるPCもあれば、1秒間に10回しか実行できないPCもあるわけです。

Time.deltaTimeを使わなかった場合

Time.deltaTimeを使わなかった場合どうなるのか。

仮に以下のコードで考えてみましょう。

void Update(){
  transform.position = transform.position + new Vector3(1, 0, 0);
}

座標xが1ずつ増えていっています。

1秒間に60回実行されるPCであれば、1秒後はx = 60の位置にいます。

ですが、1秒間に10回実行されるPCだと、1秒後はx = 10の位置になってしまいます。

つまり、環境によって1秒後のキャラクターの場所が異なってしまうんです。

格闘ゲームで例えると、めっちゃ動きの速いキャラクターと、めっちゃ遅いキャラクターが、

環境によって生まれてしまいます。

これでは公平なゲームではありませんね。

Time.deltaTimeを使った場合

では、公平にするためにTime.deltaTimeを使ってみましょう。

void Update(){
  transform.position = transform.position + new Vector3(1, 0, 0) * Time.deltaTime;
}

xが1ずつ移動するようにみえますが、Time.deltaTimeをかけているので、1ずつの移動にはなりません。

60回実行されるPCであれば、xが0.016ずつ移動しますし、

10回実行されるPCであれば、xが0.1ずつ移動します。

Update一回あたりの移動量は異なりますが、

結局、1秒後の場所は同じx = 1の場所です。

スペックが高いPCはスムーズに移動しますが、

スペックが低いPCはちょっとカクカクします。

ですが、1秒後は、結局同じところにいるんです。

なぜTime.deltaTimeが必要か

まとめると、公平性を保つためと言えます。

動作環境によってスコアが変わってしまわないように、ゲームとしての配慮が必要な場面では、

Time.deltaTimeを使いましょう!

kobakoでUnityを学ぼう!

子供向けプログラミング教室kobakoではUnityも教えています。

いきなりUnityから、というわけではありませんし、

スキルによってはUnityではなく、Processingなどの易しめのプログラミング言語を推奨する場合もあります。

少しずつのステップアップになりますが、Unityをやってみたい生徒さんがいらっしゃいましたら、

ぜひkobakoを体験してみてください。

Bruno /GermanyによるPixabayからの画像