遊戲暫停與處理模式
前言
在大多數遊戲中,通常都會希望在某些時候可以中斷遊戲,例如暫停休息或變更設定。要精細地控制哪些內容可以暫停(哪些不行)非常繁瑣,因此 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 方法。