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.

Призупинення ігор і режим процесу

Вступ

У більшості ігор бажано в якийсь момент перервати гру, щоб зробити щось інше, наприклад зробити перерву або змінити параметри. Реалізація детального контролю того, що можна призупинити (а що ні), вимагає великої праці, тому в Godot є проста структура для призупинення.

Як працює пауза

Щоб призупинити гру, необхідно встановити стан паузи. Це робиться шляхом призначення true властивості SceneTree.paused:

get_tree().paused = true

Це призведе до двох речей. По-перше, 2D і 3D фізика буде зупинена для всіх вузлів. По-друге, поведінка певних вузлів зупиниться або почнеться залежно від режиму їх процесу.

Примітка

Фізичні сервери можна зробити активними, поки гру призупинено, використовуючи їхні методи set_active.

Режими процесу

Кожен вузол у Godot має «Режим процесу», який визначає, коли він обробляється. Його можна знайти та змінити у властивостях вузла Node в інспекторі.

../../_images/pausemode.webp

Ви також можете змінити властивість за допомогою коду:

func _ready():
    process_mode = Node.PROCESS_MODE_PAUSABLE

Ось що кожен режим повідомляє вузлу робити:

  • Успадкувати: процес залежить від стану батьківського елемента, бабусі та дідуся тощо. Перший батьківський елемент, який має стан не успадковувати.

  • Пауза: обробляйте вузол (і його дочірні елементи в режимі успадкування), лише коли гру не призупинено.

  • WhenPaused: обробляти вузол (та його дочірні елементи в режимі успадкування) лише, коли гру призупинено.

  • Завжди: обробляти вузол (і його дочірні елементи в режимі успадкування) незважаючи ні на що. Призупинено чи ні, цей вузол оброблятиме.

  • Вимкнено: вузол (та його дочірні елементи в режимі успадкування) не оброблятимуться взагалі.

За замовчуванням усі вузли мають цю властивість у стані «Наслідувати». Якщо для батьківського елемента встановлено значення «Успадкувати», то перевірятимуться бабусі та дідусі тощо. Якщо стан не можна знайти в жодному з бабусь і дідусів, використовується стан паузи в SceneTree. Це означає, що за умовчанням, коли гру призупинено, кожен вузол буде призупинено. Коли вузол припиняє обробку, трапляється кілька речей.

Функції _process, _physics_process, _input і _input_event не викликатимуться. Однак сигнали все ще працюють і викликають виконання підключеної функції, навіть якщо скрипт цієї функції приєднано до вузла, який зараз не обробляється.

Вузли анімації призупинять свою поточну анімацію, аудіовузли призупинять поточний аудіопотік, а частинки призупинять. Вони відновлюються автоматично, коли гру більше не призупинено.

Важливо зазначити, що навіть якщо вузол обробляється, поки гру призупинено, фізика НЕ працюватиме для нього за замовчуванням. Як було зазначено раніше, це тому, що сервери фізики вимкнено. Фізичні сервери можна зробити активними, поки гру призупинено, використовуючи їхні методи set_active.

Приклад меню паузи

Почніть зі створення кнопки, яка використовуватиметься для призупинення гри.

Створіть меню з кнопкою закриття, установіть Режим обробки кореневого вузла меню на Призупинено, а потім сховайте меню. Оскільки для режиму процесу на кореневому вузлі встановлено значення Призупинено, усі його дочірні елементи та онуки успадкують цей режим процесу. Таким чином, усі вузли в меню розпочнуть обробку, коли гру призупинено.

Приєднайте скрипт до кореневого вузла меню, підключіть кнопку паузи, створену раніше, до нового методу в скрипта, а всередині цього методу призупиніть гру та покажіть меню паузи.

func _on_pause_button_pressed():
    get_tree().paused = true
    show()

Нарешті, підключіть кнопку закриття меню до нового методу в сценарії. У цьому методі відновіть гру та сховайте меню паузи.

func _on_close_button_pressed():
    hide()
    get_tree().paused = false

Тепер у вас повинно бути робоче меню паузи.