UnityのUpdateとFixedUpdateの違いは何ですか?


10

Update()グラフィックスとFixedUpdate()物理学に使用するように言われましたが、を使用すると入力が登録されないことがありますFixedUpdate()。私Update()がすべてのために使用する場合でもそれはうまくいきます。

私は気にする必要がありますかFixedUpdate()、それとも何か間違っていますか?

回答:


10

FixedUpdateUpdate設定に依存するよりも速くまたは遅く実行できます。これは、負荷(Update実行速度)と設定した速度FixedUpdate([編集]-> [プロジェクト設定]-> [時間] )に依存します。理想的には、Updateはフレームごとに1回実行されるため、ここで入力をキャプチャします。FixedUpdateメソッドの入力(物理ボディの制御など)を操作する必要がある場合は、フラグを設定してから、Update次のように処理しますFixedUpdate

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

FixedUpdate物理を頻繁に更新する必要はほとんどなく、固定更新の物理は変数更新の物理よりも予測(決定性)の方がはるかに簡単であるため、メソッドから物理を制御することは依然として良い考えです。


bool条件(es.GetMouseButtonDown)ではなく、軸(Input.GetAxis( "Horizo​​ntal"))から値を読み取る必要がある場合はどうなりますか?更新がFixedUpdateよりも多く実行される場合、その場合のアドバイスは何ですか?最終的に、いくつかの更新中に発生した軸の平均値を計算してから更新に使用することを検討する必要がありますか?(+1 btw)
ハイゼンバグ

FixedUpdateの速度を確認するにはどうすればよいですか?
トカモチャ2014

1
@Tokamocha固定更新のレートは、編集->プロジェクト設定->時間で設定します。
MichaelHouse

@Heisenbug個人的には、最後の値を使用して、それがどれだけうまく機能するかを確認します。予期しない結果が得られた場合、で処理されるまで軸の値の移動平均を計算する可能性がありますFixedUpdate。これは、実際に何が「感じられる」かを理解するために、いくつかのプレイテストが必要なものの1つです。
MichaelHouse

1
最近のテストで、ドキュメントで示唆されていることとは逆に、FixedUpdateで(少なくともPCでは)新しい入力フラグがすでに利用可能であることがわかりました。したがって、ここで示すように、Updateでフラグを設定し、その後の次のFixedUpdate(つまり、次のフレーム)でそれを処理すると、FixedUpdateでの入力の直接処理と比較して、実際にゲームに待ち時間のフレームを追加できます。ただし、FixedUpdateが複数あるフレームで入力を二重に処理したり、FixedUpdateがないフレームで入力が欠落したりしないように注意する必要があります。
DMGregory

7

それぞれが何をするかを理解する必要があります。Update()どちらの方法でも、可能な限り頻繁に呼び出されます(確かではありませんが、上限が設定されている可能性があります)-各フレーム。FixedUpdate()一定の時間ごとに呼び出される(つまり「固定」)。

入力はUpdate()と同じくらい単純になります(気づいたようにFixedUpdate()、入力イベントをキャッチしない可能性があるため)。ただし、ゲームロジックはどちらかに入る可能性があります。物理学は決定論的である必要があり、それがにあるべき理由FixedUpdate()です。他のものはする必要はありません。使用方法に応じて、適切な機能を決定する必要があります。

ただし、一部のアプリケーションでは、すべてのゲームロジックがFixedUpdate()(の外であってもUnity)更新されています。これは「固定ステップゲームループ」と呼ばれます。すべての更新コードを固定ステップ関数に含めると、確定性が得られ、アプリが毎回(および各デバイスで)同じように動作する可能性が高くなります。また、リプレイのようないくつかの派手な機能を可能にします。


それで、FixedUpdate()にすべてを入れても、ゲームはすべての入力を登録しますよね?
トカモチャ2014

1
いいえ、すべてのゲームロジックを更新できますが、入力チェックはできません。
NPS

2
この答えは、ミス情報でいっぱいです。まず、FixedUpdateは、n:番目のfixedDeltaTimeごとではなく、1 あたり1 / fixedDeltaTime回呼び出されます。第2に、ゲームロジックは、理由を簡単に理解できるようにするため、常にFixedUpdateに配置する必要があります。アップデートはレンダリングのみを目的としています(Unityコミュニティの誰もこれをフォローしていることはほとんどないことを知っていますが、それが実際に行われる方法です)。3番目に、FixedUpdateとその物理エンジンとの関係は、決定論とは関係ありません。
THR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.