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 在 Node 類別中提供了兩個虛擬方法來達成這個目的:Node._process() 和 Node._physics_process()。只要你在腳本裡定義了這兩個方法之一或兩者,引擎就會自動呼叫它們。
你可以使用兩種不同類型的處理流程:
空閒處理 (Idle processing)讓你可以在每一個影格盡可能頻繁地執行程式碼來更新節點。
物理處理 (Physics processing)則是以固定的頻率執行,預設每秒 60 次。這個頻率與遊戲實際的影格率無關,可以讓物理運算保持穩定流暢。任何涉及物理引擎的運算,例如移動會與環境碰撞的物件,都應該使用物理處理。
你可以在腳本中定義 _process() 方法來啟用空閒處理。可以透過呼叫 Node.set_process() 來啟用或停用空閒處理。
每當引擎繪製一個畫面影格時,會自動呼叫這個方法:
func _process(delta):
# Do something...
pass
public override void _Process(double delta)
{
// Do something...
}
請注意,_process() 的呼叫頻率取決於應用程式當下的影格率(FPS),而這個數值會因為裝置或運行狀況而有所不同。
這個方法的 delta 參數代表自上次呼叫 _process() 以來經過的秒數。你應該利用這個參數來讓計算與影格率無關。例如,對於移動物件的動畫,應該始終將速度值乘上 delta。
物理處理則使用類似的虛擬方法:_physics_process()。這個方法適合用於必須在每個物理步驟發生前執行的計算,例如移動會與世界碰撞的角色。如前所述,_physics_process() 會盡可能以固定時間間隔執行,以確保物理互動的穩定性。你可以在「專案設定」的「Physics → Common → Physics Fps」中調整物理步驟的間隔,預設為每秒 60 次。
每當引擎執行物理步驟前,會自動呼叫這個方法:
func _physics_process(delta):
# Do something...
pass
public override void _PhysicsProcess(double delta)
{
// Do something...
}
_process() 方法並不會與物理處理同步。它的執行頻率取決於硬體效能與遊戲最佳化狀況。在單執行緒遊戲中,_process() 會在物理步驟執行之後才被呼叫。
你可以透過建立一個含有單一 Label 節點的場景,並掛載以下腳本,來觀察 _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.
}
}
執行場景時,你會看到計數器隨著每一影格持續增加。