私はこれをコメントとして書くつもりでしたが、最終的にはかなり長くなってしまいましたので、答えに変えました。
現在の答えはほとんど正しいですが、言及されているいくつかのことは誤解を招く/間違っています。
一般的に、ほとんどのゲームプレイ関連のタスクはに入りUpdate
ます。
たとえば、入力のポーリングを行いたくありませんFixedUpdate
(パフォーマンスのためではなく、呼び出しが単に正しく機能しないためです)。AIは同じ船に落ちます。
継続的に更新される物理学は、ゲームプレイに関連する唯一のタスクFixedUpdate
です。のようなものへの非連続/一度だけの呼び出しPhysics.Raycast
、またはにRigidbody.AddForce
属しUpdate
ます。私の言及はRigidbody.AddForce
、ドキュメンテーションによって暗示されるかもしれないことに反しているように見えますが、重要なのは継続的対非継続的です。
連続物理学だけが属する巨大な理由の1つFixedUpdate
は、実際の性質ですFixedUpdate
。他の回答では、FixedUpdateが固定interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime
/ Time.fixedDeltaTime
*で呼び出される方法に言及しています。これは、呼び出し間の実際の時間ではなく、呼び出し間のシミュレートされた時間に直接対応します。
(* Time.deltaTime
および[UnityでTime.fixedDeltaTime
呼び出されたときと同じ値FixedUpdate
は、現在の呼び出しがTime.deltaTime
発信中FixedUpdate
に返されたかどうかを判断できるTime.fixedDeltaTime
])
当然のことながら、Update
パフォーマンスが異なるため、同じ方法を一定の方法で呼び出すことはできませんFixedUpdate
。主な違いは、各フレームが、FixedUpdate
呼び出し間の正しい間隔を平均するのに十分な頻度で呼び出されていない場合、複数回呼び出されることです(または、平均が高すぎるとは呼ばれません)。これは、FixedUpdateがフレームごとに複数回呼び出すことができるということで、実行順序に関するドキュメントが参照しているものです。
... FixedUpdate:FixedUpdateは、Updateよりも頻繁に呼び出されます。フレームレートが低い場合はフレームごとに複数回呼び出すことができ、フレームレートが高い場合はフレーム間でまったく呼び出されないことがあります...
残りの実行順序とエンジンの性質により、これは物理に影響しませんが、他に入力したものはほとんど影響をFixedUpdate
受け、問題が発生します。
たとえば、AI処理を内部FixedUpdate
に配置する場合、AIが連続する複数のフレームの更新をスキップしないと仮定する理由はありません。さらに、「FixedUpdateが遅れるたびに、物理学やプレイヤーの入力/移動などの処理が行われる前にAIが単一のフレームで複数回更新されます。バグと不安定な動作を追跡します。
一定の間隔で何かをする必要がある場合は、Unityが提供する他の方法(など)を使用Coroutines
しInvokeRepeating
ます。
そして、Time.deltaTime
それをいつ使用するかについての小さなメモ:
Time.deltaTimeの効果を説明する最も簡単な方法は、それがフレーム毎ユニットから、ユニットに番号を変更している毎秒。たとえばtransform.Translate(Vector3.up * 5)
、Updateのようなスクリプトを使用している場合、基本的にフレームごとに5メートルの速度で変換を移動します。つまり、フレームレートが低い場合、動きは遅くなり、フレームレートが高い場合、動きは速くなります。
同じコードを取得してに変更するとtransform.Translate(Vector3.up * 5 * Time.deltaTime)
、オブジェクトは毎秒 5メートルの速度で移動されます。つまり、フレームレートに関係なく、オブジェクトは毎秒5メートル移動します(ただし、フレームレートが遅いほど、X秒ごとに同じ量だけ移動するため、オブジェクトの動きがより激しくなります)
一般的に、あなたはあなたの動きを毎秒にしたいです。そのようにすると、コンピューターの速度に関係なく、物理/動きは同じように動作し、遅いデバイスで奇妙なバグがポップアップすることはありません。
そして、で使用する意味はありませんFixedUpdate
。上記で述べたことにより、呼び出しごとに同じ値(Fixed Update Timestep値)を取得し、値に対して何も行いません。で定義された移動/物理学FixedUpdate
はすでに1秒あたりの単位になるため、必要ありません。