Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

アイドル処理と物理処理

Games run in a loop. Each frame, you need to update the state of your game world before drawing it on screen. Godot provides two virtual methods in the Node class to do so: Node._process() and Node._physics_process(). If you define either or both in a script, the engine will call them automatically.

2種類の処理が用意されています:

  1. アイドル処理 を使うと、ノードを毎フレーム更新するようなコードを、可能な限り頻繁に実行することができます。

  2. 物理処理 は固定レートで行われ、デフォルトでは1秒間に60回です。これはゲームの実際のフレームレートとは無関係で、物理がスムーズに行われるようにします。物理エンジンが関係するもの、たとえば、環境と衝突する体を動かすような場合に使用するとよいでしょう。

スクリプトで _process() メソッドを定義することで、アイドル処理を有効にすることができます。また、 Node.set_process() を呼び出すことで、アイドル処理をオフにしたりオンに戻したりすることができます。

エンジンはフレームを描画するたびに以下のメソッドを呼び出します:

func _process(delta):
    # Do something...
    pass

エンジンが _process() を呼び出す頻度は、アプリケーションのフレームレートに依存し、時間やデバイスによって異なることを覚えておいてください。

この関数の delta パラメーターは、 _process() が前回呼び出されてからの経過時間 (秒) です。このパラメーターは、フレームレートに依存しない計算を行うために使用します。例えば、移動するオブジェクトをアニメーションさせるには、常に速度の値に delta を乗じる必要があります。

物理処理は、同様の仮想関数 _physics_process() で動作します。これはゲーム世界に衝突判定を持つキャラクターの制御など、各物理ステップの前に実行する必要がある処理に使用します。前述のとおり、 _physics_process() は物理的な相互作用を安定させるために、可能な限り固定時間間隔(デフォルトでは毎秒60回)で呼び出されます。この間隔は、プロジェクト設定の Physics -> Common-> Physics Fps で変更できます。

The engine calls this method before every physics step:

func _physics_process(delta):
    # Do something...
    pass

一方、_process() 関数は物理処理と同期されません。そのレートは一定ではなく、ハードウェアとゲームの最適化に依存します。シングルスレッドのゲームでは、物理ステップの後に実行されます。

Labelノードが1つあるシーンを作成し、以下のスクリプトをアタッチすると、_process()関数の動作を確認できます:

extends Label

var time = 0

func _process(delta):
    time += delta
    text = str(time) # 'text' is a built-in Label property.

シーンを実行すると、カウンターが各フレームごとに増加しているのが確認できます。