Update()
とFixedUpdate()
と最近、1つのスクリプトで両方の関数を使用しました。コードは機能していますが、質問があります。
これらの関数の両方を使用すると問題が発生しますか?両方を使用しても安全ですか?
回答
更新順序
ゲームのロジックとインタラクション、アニメーション、カメラの位置などを追跡する場合、使用できるさまざまなイベントがいくつかあります。一般的なパターンは、Update関数内でほとんどのタスクを実行することですが、使用できる他の関数もあります。
FixedUpdate:
FixedUpdateはUpdateよりも頻繁に呼び出されます。
フレームレートが低い場合はフレームごとに複数回呼び出すことができ、フレームレートが高い場合はフレーム間でまったく呼び出されない場合があります。すべての物理計算と更新は、FixedUpdateの直後に行われます。 FixedUpdate内で移動計算を適用する場合、値にTime.deltaTimeを掛ける必要はありません。
FixedUpdateは、信頼できるタイマーで呼び出されます。フレームレート
。
更新:
更新はフレームごとに1回呼び出されます。これは、フレーム更新の主な主力機能です。
LateUpdate:
更新が終了した後、LateUpdateはフレームごとに1回呼び出されます。
Updateで実行される計算はすべて、LateUpdateの開始時に完了します。 LateUpdateの一般的な用途は、次のサードパーソンカメラです。キャラクターを動かしてUpdate内で回転させると、LateUpdateですべてのカメラの動きと回転の計算を実行できます。これにより、カメラがその位置を追跡する前に、キャラクターが完全に移動したことが保証されます。
固定更新、更新、遅延更新を同時に使用するのは安全です。
using UnityEngine; using System.Collections; public class CheckFunctionExecutionOrder : MonoBehaviour { void FixedUpdate () { Debug.Log("FixedUpdate time :" + Time.deltaTime); } void Update () { Debug.Log("Update time :" + Time.deltaTime); } void LateUpdate() { Debug.Log("late Update time :" + Time.deltaTime); } }
コメント
- すばらしい答えです!実行する前にFixedUpdateを待機するコルーチンを作成できることを含める価値があるかもしれません。このコルーチンをstartメソッドから開始すると、effectivleyはLateFixedUpdateを提供します(これはそれほど有用ではありませんが、用途があります)。
- Time.deltaTimeを掛けることは、FixedUpdateでは依然として良い考えです。速度などを"単位ではなく"単位/秒"で表すことができます。ティックごとに"、固定タイムステップを変更した場合、'戻ってすべてのパラメータを再調整して、同じ速度。 FixedUpdateの利点は、Updateの場合のように、フレームレートと時間スケーリングに基づいてフレームごとに可変の結果を取得するのではなく、FixedUpdateからアクセスしたときにTime.deltaTimeが常に安定したfixedDeltaTimeを返すことです。
回答
これらは実際にはすべて同時に実行されており、スクリプトはこれらの関数で処理を実行するだけです。 更新はフレームごとに1回呼び出され、 FixedUpdate は「物理更新」ごとに1回呼び出されます(これはは、調整可能な一定の時間ごとに1回です。
特定の関数を後で実行する場合は、 LateUpdate もあります。その参照フレームの更新機能。メッセージの完全なリストについては、 MonoBehaviour 参照を参照してください。
コメント
- 物理アップデートは制御可能ですか?固定TimeStepをある値に設定すると、その時間の後に固定更新が実行されますか?そして、ゲームの物理学もその時間の後に機能しますか?
- @MuhammadFaizanKhanそれがどのように機能するかです。 '現在のバージョンのUnityではわかりませんが、答えを書いたときの状態でした。基本的に、更新はフレームごとに更新され、物理学には他の更新機能とは別の独自のフレームレートと更新機能があります。
回答
Update()、FixedUpdate()、LateUpdate()をすべて1つのスクリプトで使用しても安全です。少なくとも私は問題を抱えており、問題はありませんでした。通常、メインループにはUpdate()を使用し、物理学などにはFixedUpdate()を使用し、他のすべての後に実行したいループにはLateUpdate()を使用します。