Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
アイドル処理と物理処理
ゲームはループで動いています。各フレームごとに画面に描画する前にゲーム世界の状態を更新する必要があります。Godot は、そのための 2 つの仮想メソッド: Node._process() and Node._physics_process() を Node クラスに用意しています。スクリプトでどちらか、または両方を定義すると、エンジンは自動的にそれらを呼び出します。
2種類の処理が用意されています:
アイドル処理 を使うと、ノードを毎フレーム更新するようなコードを、可能な限り頻繁に実行することができます。
物理処理 は固定レートで行われ、デフォルトでは1秒間に60回です。これはゲームの実際のフレームレートとは無関係で、物理がスムーズに行われるようにします。物理エンジンが関係するもの、たとえば、環境と衝突する体を動かすような場合に使用するとよいでしょう。
スクリプトで _process() メソッドを定義することで、アイドル処理を有効にすることができます。また、 Node.set_process() を呼び出すことで、アイドル処理をオフにしたりオンに戻したりすることができます。
エンジンはフレームを描画するたびに以下のメソッドを呼び出します:
func _process(delta):
# Do something...
pass
public override void _Process(double delta)
{
// Do something...
}
エンジンが _process() を呼び出す頻度は、アプリケーションのフレームレートに依存し、時間やデバイスによって異なることを覚えておいてください。
この関数の delta パラメーターは、 _process() が前回呼び出されてからの経過時間 (秒) です。このパラメーターは、フレームレートに依存しない計算を行うために使用します。例えば、移動するオブジェクトをアニメーションさせるには、常に速度の値に delta を乗じる必要があります。
物理処理は、同様の仮想関数 _physics_process() で動作します。これはゲーム世界に衝突判定を持つキャラクターの制御など、各物理ステップの前に実行する必要がある処理に使用します。前述のとおり、 _physics_process() は物理的な相互作用を安定させるために、可能な限り固定時間間隔(デフォルトでは毎秒60回)で呼び出されます。この間隔は、プロジェクト設定の Physics -> Common-> Physics Fps で変更できます。
エンジンはすべての物理ステップの前にこのメソッドを呼び出します:
func _physics_process(delta):
# Do something...
pass
public override void _PhysicsProcess(double delta)
{
// Do something...
}
一方、_process() 関数は物理処理と同期されません。そのレートは一定ではなく、ハードウェアとゲームの最適化に依存します。シングルスレッドのゲームでは、物理ステップの後に実行されます。
Labelノードが1つあるシーンを作成し、以下のスクリプトをアタッチすると、_process()関数の動作を確認できます:
extends Label
var time = 0
func _process(delta):
time += delta
text = str(time) # 'text' is a built-in Label property.
using Godot;
public partial class CustomLabel : Label
{
private double _time;
public override void _Process(double delta)
{
_time += delta;
Text = _time.ToString(); // 'Text' is a built-in Label property.
}
}
シーンを実行すると、カウンターが各フレームごとに増加しているのが確認できます。