Обработка запросов выхода

Выход

Most platforms have the option to request the application to quit. On desktops, this is usually done with the "x" icon on the window title bar. On Android, the back button is used to quit when on the main screen (and to go back otherwise).

Обработка уведомления

On desktop platforms, the MainLoop has a special MainLoop.NOTIFICATION_WM_QUIT_REQUEST notification that is sent to all nodes when quitting is requested.

На Android вместо этого отправляется MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST. Нажатие кнопки Back приведет к выходу из приложения, если Application > Config > Quit On Go Back отмечено в настройках проекта (по умолчанию).

Примечание

MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST не поддерживается на iOS, поскольку устройства iOS не имеют физической кнопки Back.

Обработка уведомления выполняется следующим образом (на любом узле):

func _notification(what):
    if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
        get_tree().quit() # default behavior
public override void _Notification(int what)
{
    if (what == MainLoop.NotificationWmQuitRequest)
        GetTree().Quit(); // default behavior
}

При разработке мобильных приложений, выход часто не желателен, если пользователь не на главном экране, так что это поведение может быть изменено.

Важно отметить что по умолчанию, приложения Godot имеют пред-установленное поведение выхода когда выход запрашивается, что может быть изменено:

get_tree().set_auto_accept_quit(false)
GetTree().SetAutoAcceptQuit(false);

Отправка собственного уведомления о выходе

Хотя заставить приложение закрыться можно, вызвав SceneTree.quit, это не приведет к отправке уведомления о выходе. Это означает, что функция, описанная выше, не будет вызвана. Выход по вызову SceneTree.quit не позволит завершить пользовательские действия (такие как сохранение, подтверждение выхода или отладка), даже если вы попытаетесь задержать строку, заставляющую выйти.

Вместо этого следует отправить запрос на выход:

get_tree().notification(MainLoop.NOTIFICATION_WM_QUIT_REQUEST)
GetTree().Notification(MainLoop.NotificationWmQuitRequest)