このチュートリアルでは、Unity における Time.deltaTime とは何か、そしてどのように使用するかを見ていきます。
このチュートリアルの動画版は、現在この言語では利用できません。
動画の書き起こし
こんにちは皆さん。このチュートリアルでは、Unity における Time.deltaTime とは何か、そしてどのように使用するかを見ていきます。
この初心者向けチュートリアルは、Unity で C# のスクリプティングを始めたばかりの方に最適です。このトピックは基礎的でありながら非常に重要で、多くのスクリプトやチュートリアルで登場するため、しっかり理解しておく価値があります。
このチュートリアルは Unity 2022 を使用して作成されていますが、Time.deltaTime は以前の複数のバージョンから存在しており、今後も引き続き使用されるでしょう。
Time.deltaTime は、前のフレームから現在のフレームまでに経過した時間を秒単位で表す変数です。言い換えると、前のフレームの処理にかかった時間です。

この変数は、移動やアニメーションをフレームレートに依存しないものにするために使用されます。通常は、オブジェクトの 1 秒あたりの速度に Time.deltaTime を毎フレーム掛け合わせて使用します。
このようにすることで、フレームごとの移動量はフレームレートに応じて変化し、異なる性能のデバイスでも同じ速度を維持できます。
ここで、先ほど説明した内容を非常にシンプルな例で見てみましょう。一定速度で軸に沿ってオブジェクトを移動させるケースです。シーンにオブジェクトを追加し、Isometric ビューで上からシーンを表示します。

オブジェクトに C# スクリプトを追加し、例えば movement という名前を付けます。そして、1 秒間で 1 ユニット移動させるための Vector3 を作成します。
private Vector3 obVelocity = new Vector3(0.0f, 0.0f, 1.0f);
Update は毎フレーム呼び出されることは分かっています。しかし、ゲームが 1 秒あたり何フレームで実行されるかは分かりません。これはさまざまな要因によって変化します。
もしフレームレートが常に 50 フレーム毎秒であると分かっていれば、obVelocity を (0.0f, 0.0f, 0.02f) に変更できます。そうすれば Update が呼ばれるたび、つまり各フレームごとに 0.02 ユニット移動し、結果として 1 秒あたり 1 ユニット移動することになります。
しかし実際にはそのように固定することはできません。そのため、Update 内で次のように記述します。
transform.position += (obVelocity * Time.deltaTime);

スクリプトを保存し、Unity エディタに戻って結果を確認します。オブジェクトは直線的に移動し、シーン内で 1 秒あたり 1 ユニットの速度を維持します。
まとめると、オブジェクトを特定の速度で移動させたい場合、まずその速度を変数に設定し、Update 関数内で Time.deltaTime を掛け合わせます。
次に、別の例を見てみましょう。
現在使用しているシーンでは、Main Camera に移動用のスクリプトが追加されており、Input.GetAxis を使用して Horizontal と Vertical の矢印キー入力を検出しています。
Horizontal と Vertical の値はどちらも -1 から 1 の範囲です。もしこれらの値をそのまま Update 内で Time.deltaTime に掛け合わせると、シーン内で 1 秒あたり 1 ユニット移動しますが、この方法では速度を調整することができません。
この問題を解決する最も簡単な方法は、Serialized 修飾子付きの private 変数を定義することです。これにより、Editor でゲームをテストしている間、Inspector から値を確認および変更できます。
動画内の例では、この変数は speed という名前で、初期値は 12 に設定されています。

Update 関数内では、キャラクターが Character Controller コンポーネントに関連付けられているため、controller.Move を使用して移動を管理しています。Character Controller は Move 関数によって移動します。
この関数は、やや長い引数を受け取り、それは 2 つの部分に分かれています。
最初の部分では、ユーザー入力に基づいて X 軸および Z 軸方向の移動量を計算します。この値は move という変数に格納されており、Vector3 型です。
2 番目の部分では、ジャンプ時に重力の力を計算します。

Time.deltaTime は、軸方向の移動計算と重力による垂直移動の両方で使用されていますが、ここでは後者については扱いません。より長い説明が必要になるためです。ここでは最初の部分に注目します。
移動ベクトル move は、最初の例のキューブと同様に Time.deltaTime を掛け合わせていますが、さらに float 型の変数 speed も掛け合わせています。
その後 Unity エディタに切り替えてゲームを開始し、スクリプトタブ内の Speed パラメータの値をリアルタイムで変更することで、キャラクターの移動速度を変えられることを示します。
この方法により、ゲーム開始時の適切な速度を調整できます。
この速度は Time.deltaTime と掛け合わせられているため、実行時のフレームレートに関係なく、さまざまなデバイスで同じ速度になります。
speed はコード内の変数であるため、ゲーム中に特定のイベントに応じて変更することも可能です。
例えば、プレイヤーがポーションを飲んで移動速度が 2 倍になったり、逆に通常より遅くなったりすることができます。
重要なポイントは、この速度が Time.deltaTime によってフレームレートに依存せず、異なるデバイス間でも一貫しているということです。
まとめとして、この動画では Time.deltaTime の 2 つの簡単な使用例を見てきました。
近いうちに、Slerp を使用した回転に関する動画を公開する予定です。その中でも Time.deltaTime を使用して、フレームレートに関係なく一定速度の回転を実現します。
このチュートリアルは以上です。また次回お会いしましょう。