こんにちは!
子供向けプログラミング教室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を体験してみてください。