INDIE INDEX

レベル:実践

ゲームループとは|入力・更新・描画を毎フレーム繰り返す、ゲームの基本構造

言葉の意味

ゲームループは、ゲームを動かし続けるために、コマ(フレーム)ごとに繰り返される処理です。毎コマ、ゲームの世界の状態を更新してから画面に描きます。

たとえば Godot でも、この意味で使われています。処理は2つに分かれており、できるだけ多くの回数、毎コマ実行されるものと、1秒間に決まった回数(既定では60回)で実行されるものがあります。後者は実際の描画の回数から独立していて、物理演算をなめらかに保つために使われます。毎コマの処理では、前回の呼び出しからの経過時間を受け取れるので、コマの間隔がそろわなくても動く速さを一定に保てます。

作り手がこの語を使う場面は、スクリプトに書く関数です。Godot では、スクリプトに _process(毎コマ)か _physics_process(物理の更新ごと)の関数を、どちらか一方または両方定義すると、エンジンが自動で呼びます。_process はコマを描くたびに呼ばれ、_physics_process は物理の更新の前に毎回呼ばれます。どちらも、Node(ノード)のクラスにある関数で、そのノードがシーンツリーにあるときだけ呼ばれます。Unity では、プレイヤーループ(Player loop)の全体は、特定のシステムとサブシステムの更新の並びで、それらの更新は決まった既定の順に1つずつ実行されます。

物理の更新の回数や間隔は、プロジェクトの設定で変えられます。Godot では、プロジェクト設定の physics/common/physics_ticks_per_second が、物理演算と _physics_process の関数が実行される頻度を決めます。この設定は、プロジェクトの開始時にだけ読み込まれるので、実行中に変えるときは Engine.physics_ticks_per_second を使います。1コマで進められる物理の更新の数には、physics/common/max_physics_steps_per_frame(既定は8)の上限があります。

Unity では、Update は MonoBehaviour が有効なとき、1コマに1回呼ばれます。FixedUpdate は、物理の更新の中で一定の間隔で呼ばれ、その間隔は Time.fixedDeltaTime の値で決まります。この値は、コードか、エディターの Time 設定にある固定の時間の刻み(Fixed Timestep)の値で変えられ、既定は0.02秒(1秒に50回)です。FixedUpdate は、コマの回数や物理の計算の必要に応じて、1コマに0回、1回、または複数回呼ばれることがあります。

Godot でゲームを一時停止するときは、SceneTree の paused プロパティに true を入れます。すると、次の2つが起きます。

  1. 2D と 3D の物理が、すべてのノードで止まります。物理サーバーは、一時停止のあいだも set_active のメソッドで有効にできます。
  2. ノードごとの処理モード(Process Mode)に応じて、一部のノードの処理が止まったり、始まったりします。

既定では、すべてのノードが Inherit(親の状態に従う)で、親・祖父母とたどって Inherit 以外の状態が見つからなければ、SceneTree の一時停止の状態が使われます。そのため、既定では一時停止するとすべてのノードが止まります。処理が止まったノードでは、_process・_physics_process・_input・_input_event の関数は呼ばれませんが、シグナルは働き、つないだ関数は実行されます。一時停止中も処理されるノードでも、既定では物理は働きません。

_physics_process の関数を作例のコードで読む節は、GDScriptを読む|変数・条件・関数・シグナルにあります。

次に読む

情報源

関連ページ2

このページの内容の誤りは、問い合わせの窓口で受け付けています。