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 提供了一個簡易的暫停架構。
暫停的運作方式
要暫停遊戲,必須設定暫停狀態。只需將 SceneTree.paused 屬性設為 true :
get_tree().paused = true
GetTree().Paused = true;
這麼做會導致兩件事:首先,所有節點的 2D 與 3D 物理都會被暫停。其次,部分節點會根據它們的處理模式,決定是否繼續執行行為。
備註
即使遊戲暫停,也可以用 set_active 方法讓物理伺服器維持啟用狀態。
處理模式
Godot 的每個節點都有「暫停模式」來決定何時進行處理。你可以在屬性面板的 Node 屬性中檢查並修改。
你也可以用程式碼來變更此屬性:
func _ready():
process_mode = Node.PROCESS_MODE_PAUSABLE
public override void _Ready()
{
ProcessMode = Node.ProcessModeEnum.Pausable;
}
以下是各個模式對節點的行為說明:
Inherit(繼承):依據父節點、祖父節點等的狀態來決定是否處理。會尋找最近一個非 Inherit 狀態的上層節點。
Pausable(可暫停):只有在遊戲未暫停時,才會處理節點(以及處於繼承模式的子節點)。
WhenPaused(僅暫停時處理) : 僅 在遊戲暫停時,才會處理節點(以及繼承模式下的子節點)。
Always(永遠處理):無論遊戲是否暫停,都會處理節點(及處於繼承模式的子節點)。
Disabled(停用):節點(及其繼承模式下的子節點)完全不會被處理。
預設情況下,所有節點的這個屬性都是「Inherit」狀態。如果父節點也是 Inherit,就會依序往上尋找,直到遇到非 Inherit 狀態的祖先節點。若都沒有,則會以 SceneTree 的暫停狀態為準。換句話說,預設情況下,當遊戲暫停時,所有節點都會被暫停。節點停止處理時會發生一些事情。
_process、_physics_process、_input、_input_event 這些函式將不會被呼叫。不過,訊號依然可以正常運作,連接的函式也會執行,即使該腳本掛在暫停中的節點上。
動畫節點會暫停目前的動畫,音訊節點會暫停目前的音訊流,粒子也會暫停。當遊戲恢復時,這些內容會自動繼續。
需要注意的是,即使一個節點在遊戲暫停時仍有運作,預設情況下物理功能**不會**運作。這是因為物理伺服器會被停用。如前所述,若要在暫停時啟用物理伺服器,可以使用 set_active 方法。