Unity はフレームごとに 1 回、いくつかの更新を実行します。MonoBehaviour スクリプトは、MonoBehaviour.Update メソッドによりこの更新ループにフックすることができます。例えば、ゲームキャラクターの Update メソッドでは、ジョイパッドからユーザー入力を読み取り、キャラクターを一定量、前進させることができます。このような時間ベースのアクションを処理する場合は、ゲームのフレームレートが変化する可能性があるため、Update 呼び出しの時間の間隔も変化することに注意してください。
ゲームの変数フレームレートは、1 秒あたりのフレーム数 (FPS) で表されることがよくあります。フレームレートは、ホストデバイスの能力や、各フレームの描画に必要なグラフィックスと計算の複雑さなどの要因によって異なります。例えば、画面上にアクティブなキャラクターが 100 人いる場合、ゲームの実行フレームレートは 1 人の場合よりも遅くなる可能性があります。
品質設定 または Adaptive Performance パッケージ により他の制約がある場合を除き、Unity はできる限り高速なフレームレートでゲームを実行しようとします。各フレームで発生する処理の詳細については、実行順序図 の ゲームロジック セクションを参照してください。
フレームごとに、徐々に前方にオブジェクトを動かす作業を考えて見ましょう。最初は、フレームごとに一定の距離ずつオブジェクトを変換しているように見えるかもしれません。
//C# script example
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
public float distancePerFrame;
void Update() {
transform.Translate(0, 0, distancePerFrame); // this is incorrect
}
}
ただし、このコードでは、フレームレートが変化すると、オブジェクトの見かけ上のスピードも変化します。ゲームが 100 FPS で実行されている場合、オブジェクトは distancePerFrame を 1 秒間に 100 回移動します。しかし、フレームレートが 60 FPS に減速した場合は (CPU の負荷などによる) 、1 秒間に 60 回しか前進しないため、同じ時間でカバーする距離が短くなります。
ゲームやアニメーションの場合をはじめ、ほとんどの場合、これは望ましくありません。フレームレートに関係なく、安定した予測可能な速度でゲーム内オブジェクトを移動させたい場合の方がはるかに一般的です。解決策は、各フレームの経過時間によって各フレームの移動量を調整することです。経過時間は、Time.deltaTime プロパティから読み取ることができます。
//C# script example
using UnityEngine;
using System.Collections;
public class ExampleScript : MonoBehaviour {
public float distancePerSecond;
void Update() {
transform.Translate(0, 0, distancePerSecond * Time.deltaTime);
}
}
移動は distancePerFrame ではなく distancePerSecond として指定されることに注意してください。フレームレートの変化に応じて移動距離が変わるため、オブジェクトの速度は一定になります。
ターゲットプラットフォームに応じて、application.targetFrameRate または QualitySettings.vSyncCount を使用してアプリケーションのフレームレートを設定します。詳細については、 Application.targetFrameRate API に関するドキュメント を参照してください。