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.

空閒處理與物理處理

遊戲運作時會不斷循環。每一個畫面影格,你都需要在將畫面繪製到螢幕前,先更新遊戲世界的狀態。Godot 在 Node 類別中提供了兩個虛擬方法來達成這個目的:Node._process()Node._physics_process()。只要你在腳本裡定義了這兩個方法之一或兩者,引擎就會自動呼叫它們。

你可以使用兩種不同類型的處理流程:

  1. 空閒處理 (Idle processing)讓你可以在每一個影格盡可能頻繁地執行程式碼來更新節點。

  2. 物理處理 (Physics processing)則是以固定的頻率執行,預設每秒 60 次。這個頻率與遊戲實際的影格率無關,可以讓物理運算保持穩定流暢。任何涉及物理引擎的運算,例如移動會與環境碰撞的物件,都應該使用物理處理。

你可以在腳本中定義 _process() 方法來啟用空閒處理。可以透過呼叫 Node.set_process() 來啟用或停用空閒處理。

每當引擎繪製一個畫面影格時,會自動呼叫這個方法:

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

請注意,_process() 的呼叫頻率取決於應用程式當下的影格率(FPS),而這個數值會因為裝置或運行狀況而有所不同。

這個方法的 delta 參數代表自上次呼叫 _process() 以來經過的秒數。你應該利用這個參數來讓計算與影格率無關。例如,對於移動物件的動畫,應該始終將速度值乘上 delta

物理處理則使用類似的虛擬方法:_physics_process()。這個方法適合用於必須在每個物理步驟發生前執行的計算,例如移動會與世界碰撞的角色。如前所述,_physics_process() 會盡可能以固定時間間隔執行,以確保物理互動的穩定性。你可以在「專案設定」的「Physics → Common → Physics Fps」中調整物理步驟的間隔,預設為每秒 60 次。

每當引擎執行物理步驟前,會自動呼叫這個方法:

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

_process() 方法並不會與物理處理同步。它的執行頻率取決於硬體效能與遊戲最佳化狀況。在單執行緒遊戲中,_process() 會在物理步驟執行之後才被呼叫。

你可以透過建立一個含有單一 Label 節點的場景,並掛載以下腳本,來觀察 _process() 方法的運作:

extends Label

var time = 0

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

執行場景時,你會看到計數器隨著每一影格持續增加。