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 提供了一個簡易的暫停架構。

暫停的運作方式

要暫停遊戲,必須設定暫停狀態。只需將 SceneTree.paused 屬性設為 true

get_tree().paused = true

這麼做會導致兩件事:首先,所有節點的 2D 與 3D 物理都會被暫停。其次,部分節點會根據它們的處理模式,決定是否繼續執行行為。

備註

即使遊戲暫停,也可以用 set_active 方法讓物理伺服器維持啟用狀態。

處理模式

Godot 的每個節點都有「暫停模式」來決定何時進行處理。你可以在屬性面板的 Node 屬性中檢查並修改。

../../_images/pausemode.webp

你也可以用程式碼來變更此屬性:

func _ready():
    process_mode = Node.PROCESS_MODE_PAUSABLE

以下是各個模式對節點的行為說明:

  • Inherit(繼承):依據父節點、祖父節點等的狀態來決定是否處理。會尋找最近一個非 Inherit 狀態的上層節點。

  • Pausable(可暫停):只有在遊戲未暫停時,才會處理節點(以及處於繼承模式的子節點)。

  • WhenPaused(僅暫停時處理) 在遊戲暫停時,才會處理節點(以及繼承模式下的子節點)。

  • Always(永遠處理):無論遊戲是否暫停,都會處理節點(及處於繼承模式的子節點)。

  • Disabled(停用):節點(及其繼承模式下的子節點)完全不會被處理。

預設情況下,所有節點的這個屬性都是「Inherit」狀態。如果父節點也是 Inherit,就會依序往上尋找,直到遇到非 Inherit 狀態的祖先節點。若都沒有,則會以 SceneTree 的暫停狀態為準。換句話說,預設情況下,當遊戲暫停時,所有節點都會被暫停。節點停止處理時會發生一些事情。

_process_physics_process_input_input_event 這些函式將不會被呼叫。不過,訊號依然可以正常運作,連接的函式也會執行,即使該腳本掛在暫停中的節點上。

動畫節點會暫停目前的動畫,音訊節點會暫停目前的音訊流,粒子也會暫停。當遊戲恢復時,這些內容會自動繼續。

需要注意的是,即使一個節點在遊戲暫停時仍有運作,預設情況下物理功能**不會**運作。這是因為物理伺服器會被停用。如前所述,若要在暫停時啟用物理伺服器,可以使用 set_active 方法。

暫停選單範例

首先,建立一個用於暫停遊戲的按鈕。

建立一個包含關閉按鈕的選單,並將選單根節點的 處理模式 設為 When Paused,然後將選單隱藏。由於根節點的處理模式設為 When Paused,所有其子節點與孫節點都會繼承該模式。這樣一來,在遊戲暫停時,選單內的所有節點就會開始運作。

將腳本掛在選單的根節點,並將前面建立的暫停按鈕連接到腳本中的新方法。在該方法內讓遊戲進入暫停狀態,並顯示暫停選單。

func _on_pause_button_pressed():
    get_tree().paused = true
    show()

最後,將選單的關閉按鈕連接至腳本中的另一個新方法。在該方法內恢復遊戲並隱藏暫停選單。

func _on_close_button_pressed():
    hide()
    get_tree().paused = false

現在你應該已經設計出可運作的暫停選單了。