处理退出请求

退出

大多数平台都有要求应用程序退出的选项。在桌面系统中,这通常是通过窗口标题栏上的“x”图标来实现的。在移动设备上,应用程序可以在后台暂停时随时退出。

处理通知

在桌面及 Web 平台上, Node 会在窗口管理器发出退出请求时接受到 MainLoop.NOTIFICATION_WM_QUIT_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 在应用程序暂停时执行需要的操作。

备注

On iOS, you only have approximately 5 seconds to finish a task started by this signal. If you go over this allotment, iOS will kill the app instead of pausing it.

On Android, pressing the Back button will exit the application if Application > Config > Quit On Go Back is checked in the Project Settings (which is the default). This will fire 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