Обработка запросов выхода
Выход
На большинстве платформ есть возможность запросить завершение работы приложения. На настольных компьютерах это обычно делается с помощью значка "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 нажатие кнопки «Back» закроет приложение, если в настройках проекта установлен флажок 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.