空閒處理與物理處理
遊戲運作時會不斷循環。每一個畫面影格,你都需要在將畫面繪製到螢幕前,先更新遊戲世界的狀態。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.
}
}
執行場景時,你會看到計數器隨著每一影格持續增加。