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”图标来实现的。在移动设备上,应用程序可以在后台暂停时随时退出。

处理通知

在桌面及 Web 平台上,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 平台上,如果在项目设置中勾选了应用 > 配置 > 返回时退出(默认处于启用状态),按下“后退”键时就会退出应用程序。这个按键会发送 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