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.

處理結束(退出)請求

結束(退出)

大多數平台都提供結束應用程式的選項。在桌面系統中,通常是透過視窗標題列上的「X」圖示來關閉應用程式。在行動裝置上,當應用程式被掛起至背景時,也可能會隨時被結束。

處理通知事件

在桌面與網頁平台,當視窗管理員要求結束時,Node 會收到一個特殊的 NOTIFICATION_WM_CLOSE_REQUEST 通知。

可以在任何節點上,如下方式處理這個通知:

func _notification(what):
    if what == NOTIFICATION_WM_CLOSE_REQUEST:
        get_tree().quit() # default behavior

請注意,預設情況下,Godot 應用程式會在收到視窗管理員的結束請求時自動結束。這個行為可以變更,讓使用者自行處理完整的結束流程:

get_tree().set_auto_accept_quit(false)

在行動裝置上

在行動平台上沒有與 NOTIFICATION_WM_CLOSE_REQUEST 完全對應的通知。由於行動作業系統的特性,唯一能在結束前執行程式碼的時機,是應用程式被掛起(暫停)到背景時。在 Android 與 iOS 上,無論使用者或作業系統,隨時都可能在應用程式掛起時將其終止。因此,建議利用 NOTIFICATION_APPLICATION_PAUSED,於應用掛起時執行必要的動作。

備註

在 iOS 上,收到此訊號後大約只有 5 秒能完成相關任務。如果超過這個時間,iOS 會直接終止應用程式,而不是只是將其暫停。

在 Android 上,如果在專案設定中勾選了 Application > Config > Quit On Go Back (預設為啟用),按下返回鍵將會結束應用程式,並觸發 NOTIFICATION_WM_GO_BACK_REQUEST

自訂結束通知的發送

雖然可以透過呼叫 SceneTree.quit 來強制關閉應用程式,但這樣不會向場景樹中的節點發送 NOTIFICATION_WM_CLOSE_REQUEST。直接呼叫 SceneTree.quit 結束,將無法讓自訂流程(如儲存、確認結束或除錯等)完成,即使你嘗試延遲強制結束的執行也一樣。

如果你想讓場景樹中的所有節點都能收到即將結束程式的通知,應該自行發送此通知:

get_tree().root.propagate_notification(NOTIFICATION_WM_CLOSE_REQUEST)

發送這個通知只會讓所有節點知道程式即將結束,但本身不會終止程式(與 3.X 版本不同)。如果要達到過去的效果,應在發送通知後,再呼叫 SceneTree.quit