UnityのUpdateメソッドとFixedUpdateの違いは?


14

私はUnity3dを学ぶために始めていると私が得る混乱の一つは、間の差であるUpdate()FixedUpdate()

私はそこでLynda Unity 2Dゲーム開発チュートリアルに従っています、インストラクターはUpdateメソッドを使用し、プレーヤーはRigidBody2DコンポーネントとBoxコライダーを持っています、彼はUpdateメソッドを使用してプレーヤーを翻訳しUpdateますこれでFixedUpdate、すべてが動作します。彼はUnity 4.3のチュートリアルを提供しており、Unity 4.6のコースを受講しています。

どこで使うべきUpdateFixedUpdate

回答:


14

私はこれをコメントとして書くつもりでしたが、最終的にはかなり長くなってしまいましたので、答えに変えました。

現在の答えはほとんど正しいですが、言及されているいくつかのことは誤解を招く/間違っています。

一般的に、ほとんどのゲームプレイ関連のタスクはに入り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が提供する他の方法(など)を使用CoroutinesInvokeRepeatingます。

そして、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秒あたりの単位になるため、必要ありません。


4

このUpdate関数はフレームごとに呼び出されます。その頻度は、コンピューターが画像をレンダリングできる速度に依存します。低速のコンピューターでUpdateは、高速のコンピューターよりも呼び出される頻度が少なくなります。時間ベースの計算を行う場合、それを使用しTime.deltaTimeて正規化できます。これにより、前回のUpdate呼び出しからどれくらいの時間が経過したかがわかります(注意が適用されます)。
通常Update、表示関連のタスク(UI要素の更新など)の実行に使用します

このFixedUpdate関数は、一定の間隔で呼び出されます。画像の更新頻度に関係なく、1秒あたりの回数FixedUpdateと呼ばれ ます。通常、ゲームプレイ関連のタスク(物理の更新など)を実行するために使用します。1/Time.fixedDeltaTime
FixedUpdate


これは、Time.delta時間で乗算する代替手段ですか?どちらかを使用する理由はありますか?
ベン

@Benには2つの異なる目標があり、あなたがしていることに正しい機能を使うべきです。
o0 '。

@Lohoris申し訳ありませんが、UpdateにFixedUpdateを使用し、Time.deltaTimeを掛けてフレーム独立にする理由はありますか?
ベン

@Benはい、精度。レンダリングUpdateが遅いシステムでは、呼び出される頻度が少なくなり、シミュレーションの影響が大きくなります。シミュレーションが単純な間は気付かないかもしれませんが、そうでないと恐ろしく簡単に壊れます。
o0 '。

1
@Ben no:シミュレーションを正確にしたい場合は、毎回ランダムに大きいまたは小さい大きなステップではなく、多くの小さなステップを実行する必要があります。いや、FixedUpdateの重要なポイントは、何度も呼び出されることであり、質問はありません。
o0 '。

2

from:http : //unity3d.com/learn/tutorials/modules/beginner/scripting/update-and-fixedupdate

FixedUpdateで使用されるタイムステップは可変ではありません。

ゲームが遅れ始めた場合、追いつくとき、1回の更新で10秒を超える物理演算を必要としないため、通常、固定間隔で呼び出されるFixedUpdateで行われます。

例えば:

Update(float elapsedSeconds)
{
  Position += Velocity * 34.23423; //Windows Update is self-important
}
FixedUpdate(float elapsedSeconds)
{
  Position += Velocity * 0.0166; //60fps
}

どこ:

Update(34.23423)

==

FixedUpdate(10.0)
FixedUpdate(10.0)
FixedUpdate(10.0)
//4.23423 + 5.76577 game-seconds later...
FixedUpdate(10.0)

私は私の答えでこれについて言及しましたFixedUpdateが、実際には一定の間隔で呼び出されません。実際の性質はFixedUpdate、ゲームが遅れ始めたら物理学の複数のサイクルを1つのフレームに絞り込み、速すぎる場合はサイクルをスキップして、平均が固定更新タイムステップになるようにすることです。Unityはマルチスレッドではないため、一定の間隔でFixedUpdate呼び出しを保証する方法はありません(FixedUpdateに時間がかかりすぎるとどうなりますか)。それがあったとしても、おそらくそれはほとんど不可能に近いでしょう。
セラリアドボール

ほとんどの[Unity?]の人々は、Render / Update / FixedUpdateがすべて単一のコールバックメソッド内から呼び出されることを認識していないため、概念化しました。がんばってくれてありがとう!
ジョン

2

Updateできるだけ早く呼び出されます。変数 'Time.deltaTime'は、最後の呼び出し以降に経過した実際の時間に設定されます。ラグなどがゲームの速度を落とす場合、ラグUpdateが終了すると一度だけ呼び出されますdeltaTime

FixedUpdate定期的に呼び出されます。「Time.fixedDeltaTime」で指定された比率よりも頻繁に呼び出されることはありません。ラグなどが原因でゲームが遅くなる場合、FixedUpdate、ゲームが追いつくために連続して複数回呼び出されます。実行前とTime.deltaTime同じに設定されていますが、これは2つの間でコードを簡単に移行できるようにするための単なるごまかしです。Time.fixedDeltaTimeFixedUpdate

一般に、Update補間可能な動作、およびFixedUpdate段階的に計算する必要がある動作、または物理ベースの動きなどの動作に依存する動作に使用する必要があります。Update行に沿って何らかの種類のループを作成してfor(time=0;time<=deltaTime;time+=someStep)...いる場合は、代わりにFixedUpdateで実行する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.