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...
Усунення проблем з фізикою
Працюючи з фізичним механізмом, ви можете зіткнутися з несподіваними результатами.
Хоча багато з цих проблем можна вирішити за допомогою налаштування, деякі з них є результатом помилок движка. Щодо відомих проблем, пов'язаних із фізичним движком, див. відкриті проблеми, пов'язані з фізикою, на GitHub. Перегляд закритих проблем також може допомогти відповісти на питання, пов'язані з поведінкою фізичного движка.
Об'єкти проходять один крізь одного на великій швидкості
This is known as tunneling. Enabling Continuous CD (Continuous Collision Detection) in the RigidBody properties can sometimes resolve this issue. If this does not help, there are other solutions you can try:
Зробіть статичні форми зіткнень товщі. Наприклад, якщо у вас є тонка підлога, під яку гравець якимось чином не може пройти, ви можете зробити колайдер товщим, ніж візуальне представлення підлоги.
Змінюйте форму зіткнення об'єкта, що швидко рухається, залежно від швидкості його руху. Чим швидше об’єкт рухається, тим більша форма зіткнення має виходити за межі об’єкта, щоб він міг надійніше зіткнутися з тонкими стінками.
Збільште Physics Ticks per Second у розширених налаштуваннях проекту. Хоча це має інші переваги (наприклад, більш стабільне моделювання та зменшення затримки введення), це збільшує використання ЦП і може бути непридатним для мобільних/веб-платформ. Множники зі значенням за замовчуванням
60(наприклад,120,180або240) слід віддавати перевагу для плавного відображення на більшості дисплеїв.
Складені об’єкти нестабільні та хиткі
Незважаючи на те, що проблема здається простою, стабільну симуляцію RigidBody із складеними об’єктами важко реалізувати у фізичному механізмі. Це викликано інтеграцією сил, які протистоять одна одній. Чим більше складених об’єктів, тим сильнішими будуть сили, що протистоять один одному. Зрештою це призводить до того, що симуляція стає хиткою, через що об’єкти не можуть лежати один на одному без руху.
Збільшення швидкості симуляції фізики може допомогти вирішити цю проблему. Для цього збільште Physics Ticks per Second у розширених налаштуваннях проекту. Зверніть увагу, що це збільшує використання ЦП і може бути непридатним для мобільних/веб-платформ. Множники зі значенням за замовчуванням 60 (наприклад, 120, 180 або 240) слід віддавати перевагу для плавного відображення на більшості дисплеїв.
У 3D перемикання фізичного движка зі стандартного GodotPhysics на Jolt також може покращити стабільність. Див. Використання Jolt Physics для отримання додаткової інформації.
Масштабовані фізичні тіла або форми зіткнення не стикаються належним чином
Godot наразі не підтримує масштабування фізичних тіл або форм зіткнень. Як обхідний шлях, змініть межі форми зіткнення замість того, щоб змінювати її масштаб. Якщо ви бажаєте, щоб масштаб візуального представлення також змінився, змініть масштаб основного візуального представлення (Sprite2D, MeshInstance3D, …) і змініть розміри форми зіткнення окремо. У цьому випадку переконайтеся, що форма зіткнення не є дочірньою формою візуального представлення.
Since resources are shared by default, you'll have to make the collision shape resource unique if you don't want the change to be applied to all nodes using the same collision shape resource in the scene. This can be done in two ways:
In the editor, by clicking in the CollisionShape resource dropdown in the inspector, then changing its size.
In a script, by calling
duplicate()in a script on the collision shape resource before changing its size.
Тонкі предмети хитаються, коли вони лежать на підлозі
Це може бути спричинено однією з двох причин:
Форма зіткнення підлоги занадто тонка.
Форма зіткнення RigidBody занадто тонка.
У першому випадку це можна пом'якшити, зробивши форму зіткнення підлоги товщею. Наприклад, якщо у вас є тонка підлога, під яку гравець якимось чином не може пройти, ви можете зробити колайдер товщим, ніж візуальне представлення підлоги.
У другому випадку це зазвичай можна вирішити лише збільшенням швидкості симуляції фізики (оскільки збільшення товщини форми призведе до розриву зв’язку між візуальним представленням RigidBody та його зіткненням).
В обох випадках збільшення швидкості симуляції фізики також може допомогти вирішити цю проблему. Для цього збільште Physics Ticks per Second у розширених налаштуваннях проекту. Зауважте, що це збільшує використання ЦП і може бути непридатним для мобільних/веб-платформ. Множники зі значенням за замовчуванням 60 (наприклад, 120, 180 або 240) слід віддавати перевагу для плавного відображення на більшості дисплеїв.
Форми зіткнення циліндрів нестабільні
Перемикання фізичного движка зі стандартного GodotPhysics на Jolt має зробити форми зіткнень циліндрів надійнішими. Див. Використання Jolt Physics для отримання додаткової інформації.
Під час переходу від Bullet до GodotPhysics у Godot 4 форми зіткнень циліндрів довелося реалізовувати з нуля. Однак форми зіткнення циліндрів є однією з найскладніших форм для підтримки, тому багато інших фізичних движків не надають жодної підтримки для них. Наразі існує кілька відомих помилок із формами зіткнення циліндрів.
Якщо ви використовуєте GodotPhysics, ми рекомендуємо поки що використовувати для персонажів форми зіткнення типу «коробка» або «капсула». Коробки зазвичай забезпечують найкращу надійність, але мають недолік: персонаж займає більше місця по діагоналі. Форми зіткнення типу «капсула» не мають цього недоліку, але їхня форма може ускладнити точне переміщення по платформах.
Симуляція VehicleBody нестабільна, особливо на високих швидкостях
Коли фізичне тіло рухається з високою швидкістю, воно проходить велику відстань між кожним кроком фізики. Наприклад, при використанні конвенції 1 одиниця = 1 метр у 3D транспортний засіб, що рухається зі швидкістю 360 км/год, проїжджатиме 100 одиниць за секунду. З частотою моделювання фізики за замовчуванням 60 Гц транспортний засіб рухається на ~1,67 одиниці за кожен такт фізики. Це означає, що невеликі об’єкти можуть повністю ігноруватися транспортним засобом (через тунелювання), а також те, що симуляція має мало даних для роботи загалом на такій високій швидкості.
Транспортні засоби, що швидко рухаються, можуть отримати значну користь від збільшення швидкості симуляції фізики. Для цього збільште Physics Ticks per Second у розширених налаштуваннях проекту. Зауважте, що це збільшує використання ЦП і може бути непридатним для мобільних/веб-платформ. Множники зі значенням за замовчуванням 60 (наприклад, 120, 180 або 240) слід віддавати перевагу для плавного відображення на більшості дисплеїв.
Зіткнення призводить до ударів, коли об’єкт рухається по плитках
Це відома проблема у фізичному механізмі, спричинена тим, що об’єкт натикається на краї фігури, навіть якщо цей край закритий іншою фігурою. Це може відбуватися як у 2D, так і в 3D.
Найкращий спосіб вирішити цю проблему — створити «композитний» колайдер. Це означає, що замість зіткнення окремих плиток ви створюєте єдину форму зіткнення, що представляє зіткнення для групи плиток. Як правило, ви повинні розділити складені колайдери на острівну основу (це означає, що кожна група плиток, що дотикаються, отримує власний колайдер).
Використання композитного колайдера також може покращити продуктивність фізичного моделювання в певних випадках. Однак, оскільки комбінована форма зіткнення є набагато складнішою, це не може бути чистим виграшем продуктивності у всіх випадках.
Порада
У Godot 4.5 та пізніших версіях створення композитного колайдера відбувається автоматично при використанні вузла TileMapLayer. Розмір фрагмента (за замовчуванням 16 плиток на кожній осі) можна встановити за допомогою властивості Physics Quadrant Size в інспекторі TileMapLayer. Більші значення забезпечують більш надійне зіткнення, але за рахунок повільнішого оновлення при зміні TileMap.
Частота кадрів падає, коли об’єкт торкається іншого об’єкта
Ймовірно, це пов’язано з тим, що один із об’єктів використовує надто складну форму зіткнення. Опуклі форми зіткнення мають використовувати якомога меншу кількість форм з міркувань продуктивності. Якщо покладатися на автоматичну генерацію Godot, можливо, ви отримали десятки, якщо не сотні фігур, створених для одного ресурсу зіткнення опуклих форм.
У деяких випадках заміна опуклого коллайдера парою примітивних форм зіткнення (ящик, сфера чи капсула) може забезпечити кращу продуктивність.
Ця проблема також може виникнути зі статичними тілами, які використовують дуже детальні трійчасті (увігнуті) зіткнення. У цьому випадку використовуйте спрощене представлення геометрії рівня як колайдера. Це не тільки значно покращить продуктивність фізичного моделювання, але також може покращити стабільність, дозволяючи усунути невеликі кріплення та щілини від зіткнення.
У 3D перемикання фізичного движка зі стандартного GodotPhysics на Jolt також може покращити продуктивність. Див. Використання Jolt Physics для отримання додаткової інформації.
Частота кадрів раптово падає до дуже низького значення за межами певної фізичної симуляції
Це відбувається тому, що фізичний механізм не може встигати за очікуваною швидкістю моделювання. У цьому випадку частота кадрів почне падати, але двигуну дозволено імітувати лише певну кількість кроків фізики на візуалізований кадр. Це сніжки в ситуації, коли частота кадрів продовжує падати, поки не досягне дуже низької частоти кадрів (зазвичай 1-2 FPS), і це називається фізична спіраль смерті.
Щоб уникнути цього, вам слід перевірити, чи немає у вашому проекті ситуацій, які можуть викликати надмірну кількість симуляцій фізики одночасно (або з надто складними формами зіткнень). Якщо цих ситуацій неможливо уникнути, ви можете збільшити параметр проекту Максимальні кроки фізики на кадр і/або зменшити Тіки фізики за секунду, щоб полегшити це.
Фізичне моделювання ненадійне, коли далеко від походження світу
Це викликано помилками точності з плаваючою комою, які стають більш вираженими, оскільки фізичне моделювання відбувається далі від початку світу. Ця проблема також впливає на візуалізацію, що призводить до хиткого руху камери на великій відстані від джерела світу. Перегляньте Великі світові координати для отримання додаткової інформації.