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”图标来实现的。在移动设备上,应用程序可以在后台暂停时随时退出。
处理通知
在桌面及 Web 平台上,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 平台上,如果在项目设置中勾选了应用 > 配置 > 返回时退出(默认处于启用状态),按下“后退”键时就会退出应用程序。这个按键会发送 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。