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...
處理結束(退出)請求
結束(退出)
大多數平台都提供結束應用程式的選項。在桌面系統中,通常是透過視窗標題列上的「X」圖示來關閉應用程式。在行動裝置上,當應用程式被掛起至背景時,也可能會隨時被結束。
處理通知事件
在桌面與網頁平台,當視窗管理員要求結束時,Node 會收到一個特殊的 NOTIFICATION_WM_CLOSE_REQUEST 通知。
可以在任何節點上,如下方式處理這個通知:
func _notification(what):
if what == NOTIFICATION_WM_CLOSE_REQUEST:
get_tree().quit() # default behavior
public override void _Notification(int what)
{
if (what == NotificationWMCloseRequest)
{
GetTree().Quit(); // default behavior
}
}
請注意,預設情況下,Godot 應用程式會在收到視窗管理員的結束請求時自動結束。這個行為可以變更,讓使用者自行處理完整的結束流程:
get_tree().set_auto_accept_quit(false)
GetTree().AutoAcceptQuit = 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)
GetTree().Root.PropagateNotification((int)NotificationWMCloseRequest);
發送這個通知只會讓所有節點知道程式即將結束,但本身不會終止程式(與 3.X 版本不同)。如果要達到過去的效果,應在發送通知後,再呼叫 SceneTree.quit。