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? Чи є якісь застереження?

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

Увімкніть налаштування фізичної інтерполяції

Перший крок — увімкнути фізичну інтерполяцію в Project Settings > Physics > Common > Physics Interpolation Тепер ви можете запускати гру.

Цілком імовірно, що ніщо не виглядає суттєво інакше, особливо якщо ви використовуєте фізику на 60 TPS або більше. Однак за лаштунками відбувається чимало іншого.

Порада

Щоб перетворити існуючу гру на використання інтерполяції, наполегливо рекомендуємо тимчасово встановити Project Settings > Physics > Common > Physics Tick per Second на низьке значення, наприклад 10, що зробить проблеми інтерполяції більш очевидними.

Перемістіть (майже) всю логіку гри з _process до _physics_process

Найфундаментальніша вимога для фізичної інтерполяції (яку ви, можливо, вже робите) полягає в тому, що ви повинні рухатися та виконувати ігрову логіку на своїх об’єктах у межах _physics_process (який виконується на фізиці), а не _process (який виконується на відтвореному кадрі). Це означає, що ваші сценарії, як правило, повинні виконувати основну частину своєї обробки в межах _physics_process, включаючи реакцію на введення та ШІ.

Налаштування трансформації об’єктів лише в межах фізичних тактів дозволяє автоматичній інтерполяції мати справу з трансформаціями між фізичними тактами та гарантує, що гра працюватиме однаково, незалежно від того, на якій машині вона працює. Як бонус, це також зменшує використання процесора, якщо гра рендериться з високим FPS, оскільки логіка штучного інтелекту (наприклад) більше не працюватиме на кожному відрендереному кадрі.

Примітка

Якщо ви спробуєте встановити перетворення інтерпольованих об’єктів поза фізикою, обчислення для інтерпольованої позиції будуть неправильними, і ви отримаєте тремтіння. Це тремтіння може бути невидимим на вашій машині, але воно виникне у деяких гравців. З цієї причини слід уникати налаштування перетворення інтерпольованих об’єктів поза межами фізики. Godot спробує створити попередження в редакторі, якщо цей випадок буде виявлено.

Порада

Це лише м’яке правило. Бувають випадки, коли вам може знадобитися телепортувати об’єкти поза галочкою фізики (наприклад, під час початку рівня або відновлення об’єктів). Тим не менш, загалом, ви повинні застосовувати перетворення з галочки фізики.

Переконайтеся, що всі непрямі рухи відбуваються під час фізичних тактів

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

Примітка

Також врахуйте, що вузли можна переміщувати не лише переміщенням самих себе, але й переміщенням батьківських вузлів у SceneTree. Таким чином, рух батьків має відбуватися лише під час фізико-тактів.

Оберіть ставку з фізики

Під час використання фізичної інтерполяції відтворення відокремлюється від фізики, і ви можете вибрати будь-яке значення, яке має сенс для вашої гри. Ви більше не обмежені значеннями, кратними частоті оновлення монітора користувача (для геймплея без запинань, якщо досягнуто цільового FPS).

Як приблизний посібник:

Низькі показники (10-30)

Середні тики (30-60)

Високі тикові показники (60+)

Краща продуктивність ЦП

Хороша фізична поведінка в складних сценах

Добре з швидкою фізикою

Додайте деяку затримку до введення

Добре підходить для ігор від першої особи

Добре підходить для гоночних ігор

Проста фізична поведінка

Примітка

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

Викликати reset_physics_interpolation() під час телепортації об’єктів

Здебільшого інтерполяція – це те, що вам потрібно між двома фізичними галочками. Однак є одна ситуація, коли це може бути не тим, що ви хочете. Це коли ви спочатку розміщуєте об’єкти або переміщуєте їх у нове місце. Тут вам не потрібен плавний рух між місцем розташування об’єкта (наприклад, початковою позицією) і початковою позицією – вам потрібен миттєвий рух.

Рішенням цього є виклик функції Node.reset_physics_interpolation. Те, що робить ця функція під капотом, — це встановлення внутрішньо збереженого попереднього перетворення об’єкта рівним поточному перетворенню. Це гарантує, що під час інтерполяції між цими двома рівними перетвореннями не буде руху.

Навіть якщо ви забудете зателефонувати, зазвичай це не буде проблемою в більшості ситуацій (особливо при високих тиках). Це те, що ви можете легко залишити на етапі полірування вашої гри. Найгірше, що трапиться, це побачити рух смуг для кадру або близько того, коли ви їх переміщуєте - ви дізнаєтеся, коли вам це потрібно!

Фактично існує два способи використання reset_physics_interpolation():

Початок стоячи (наприклад, гравець)

  1. Встановіть початкове перетворення

  2. Викличте reset_physics_interpolation()

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

Початок руху (наприклад, куля)

  1. Встановіть початкове перетворення

  2. Викличте reset_physics_interpolation()

  3. Негайно встановіть очікуване перетворення після першого руху

Попереднє перетворення буде початковою позицією, а поточне перетворення діятиме так, ніби позначка симуляції вже відбулася. Це негайно почне рухати об’єкт, замість того, щоб затримка стояла на місці.

Важливо

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

Поради щодо тестування та налагодження

Навіть якщо ви маєте намір запустити фізику на 60 TPS, щоб ретельно перевірити свою інтерполяцію та отримати максимально плавний ігровий процес, настійно рекомендується тимчасово встановити низьке значення тактової швидкості фізики, наприклад 10 TPS.

Геймплей може працювати не ідеально, але він повинен дозволити вам легше бачити випадки, коли ви повинні викликати Node.reset_physics_interpolation, або де ви повинні використовувати власну інтерполяцію, напр. a Camera3D. Після того, як ви виправите ці випадки, ви зможете повернути потрібне значення швидкості тактів фізики.

Інша велика перевага тестування з низькою швидкістю тику полягає в тому, що ви часто можете помітити, що інші ігрові системи синхронізуються з фізичним тиком і створюють збої, які ви можете вирішити. Типові приклади включають налаштування значень змішування анімації, які ви можете встановити в _process() та інтерполювати вручну.

Примітка

У 2D положення видимих форм зіткнень, що відображається опцією Debug > Visible Collision Shapes, буде враховувати інтерполяцію фізики.

Натомість, у 3D положення видимих фігур зіткнень не враховуватиме фізичну інтерполяцію. Це означає, що видимі фігури зіткнень можуть рухатися менш плавно та з'являтися трохи попереду візуального представлення об'єкта, коли він рухається. Це не помилка, а наслідок того, як реалізована фізична інтерполяція у 3D.