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...
Форми зіткнення (2D)
Цей посібник пояснює:
Типи фігур зіткнення, доступні в 2D у Godot.
Використання зображення, перетвореного на багатокутник, як форми зіткнення.
Зауваження продуктивності щодо двовимірних зіткнень.
Godot надає багато видів колізійних форм із різною продуктивністю та точністю.
Ви можете визначити форму class_PhysicsBody2D, додавши один або кілька CollisionShape2Ds або CollisionPolygon2Ds як прямі дочірні вузли. Непрямі дочірні вузли (тобто діти дочірніх вузлів) ігноруватимуться та не використовуватимуться як форми зіткнень. Також зауважте, що ви повинні додати class_Shape2D ресурс до вузлів форми зіткнень у доку Inspector.
Примітка
Коли ви додаєте кілька форм зіткнення до одного PhysicsBody2D, вам не потрібно турбуватися про те, що вони накладаються. Вони не будуть «зіткнутися» один з одним.
Примітивні форми зіткнення
Godot надає наступні типи примітивних форм зіткнення:
class_RectangleShape2D
class_SegmentShape2D
class_SeparationRayShape2D (призначений для символів)
class_WorldBoundaryShape2D (нескінченна площина)
Ви можете представити зіткнення більшості менших об’єктів за допомогою однієї або кількох простих форм. Однак для більш складних об'єктів, таких як великий корабель або цілий рівень, вам можуть знадобитися опуклі або увігнуті форми. Детальніше про це нижче.
Ми рекомендуємо віддавати перевагу примітивним формам для динамічних об’єктів, таких як RigidBodies і CharacterBodies, оскільки їх поведінка є найбільш надійною. Вони також часто забезпечують кращу продуктивність.
Опуклі форми зіткнення
Попередження
Godot наразі не пропонує вбудованого способу створення 2D опуклих форм зіткнення. Цей розділ в основному тут для довідкових цілей.
Convex collision shapes є компромісом між примітивними формами зіткнення та увігнутими формами зіткнення. Вони можуть представляти фігури будь-якої складності, але з важливим застереженням. Як випливає з назви, окрема фігура може представляти лише опуклу форму. Наприклад, піраміда опукла, а порожниста коробка увігнута. Щоб визначити увігнутий об’єкт з єдиною формою зіткнення, потрібно використовувати увігнуту форму зіткнення.
Залежно від складності об’єкта, ви можете отримати кращу продуктивність, використовуючи кілька опуклих форм замість увігнутої форми зіткнення. Godot дозволяє використовувати опукле розкладання для створення опуклих форм, які приблизно відповідають порожнистому об’єкту. Зауважте, що ця перевага продуктивності більше не застосовується після певної кількості опуклих форм. Для великих і складних об’єктів, таких як цілий рівень, ми рекомендуємо замість цього використовувати увігнуті форми.
Увігнуті або трійчасті форми зіткнення
Concave collision shapes, які також називаються фігурами зіткнень з трійкою, можуть мати будь-яку форму, від кількох трикутників до тисяч трикутників. Увігнуті форми є найповільнішим варіантом, але також найточнішим у Godot. Ви можете використовувати лише увігнуті фігури в StaticBodies. Вони не працюватимуть із CharacterBodies або RigidBodies, якщо для RigidBody не встановлено режим Static.
Примітка
Незважаючи на те, що увігнуті форми забезпечують найточнішу колізію, звіти про контакти можуть бути менш точними, ніж примітивні форми.
Якщо не використовувати TileMaps для проектування рівнів, увігнуті форми є найкращим підходом для зіткнення рівнів.
Ви можете налаштувати режим збірки вузла CollisionPolygon2D в інспекторі. Якщо встановлено значення Solids (за замовчуванням), зіткнення включатиме багатокутник і його область. Якщо для нього встановлено значення Сегменти, зіткнення включатиме лише ребра багатокутників.
Ви можете створити увігнуту форму зіткнення з редактора, вибравши Sprite2D і скориставшись меню Sprite2D у верхній частині вікна перегляду 2D. Розкривне меню Sprite2D відкриває опцію під назвою Create CollisionPolygon2D Sibling. Коли ви натискаєте його, відображається меню з 3 налаштуваннями:
Спрощення: вищі значення призведуть до менш детальної форми, що покращує продуктивність ціною точності.
Зменшити (пікселі): Вищі значення зменшать створений багатокутник зіткнення відносно країв спрайту.
Зростання (пікселі): Вищі значення збільшать згенерований багатокутник зіткнення відносно країв спрайту. Зауважте, що встановлення рівних значень Grow і Shrink може дати інші результати, ніж якщо залишити обидва на 0.
Примітка
Якщо у вас є зображення з великою кількістю дрібних деталей, рекомендується створити спрощену версію та використовувати її для генерації багатокутника зіткнень. Це може призвести до кращої продуктивності та відчуття від гри, оскільки гравець не буде заблокований дрібними декоративними деталями.
Щоб використати окреме зображення для генерації багатокутника зіткнення, створіть інший Sprite2D, згенеруйте з нього полігон зіткнення, а потім видаліть вузол Sprite2D. Таким чином ви можете виключити дрібні деталі зі згенерованого зіткнення.
Застереження щодо продуктивності
Ви не обмежені однією формою зіткнення на PhysicsBody. Тим не менш, ми рекомендуємо зберігати якомога меншу кількість форм, щоб покращити продуктивність, особливо для динамічних об’єктів, таких як RigidBodies і CharacterBodies. Крім того, уникайте перекладу, обертання або масштабування CollisionShapes, щоб скористатися перевагами внутрішньої оптимізації фізичного механізму.
У разі використання однієї нетрансформованої форми зіткнення в StaticBody алгоритм широкої фази двигуна може відкидати неактивні PhysicsBodies. Тоді вузька фаза повинна буде враховувати лише форми активних тіл. Якщо StaticBody має багато форм зіткнення, широка фаза не вдасться. Вузька фаза, яка є повільнішою, повинна виконати перевірку на зіткнення з кожною формою.
Якщо у вас виникли проблеми з продуктивністю, вам, можливо, доведеться піти на компроміси щодо точності. Більшість ігор не мають 100% точного зіткнення. Вони знаходять творчі способи приховати це або іншим чином зробити непомітним під час звичайної гри.