Об’єкти колізій
Об’єкт колізій (collision object) — це компонент (component), за допомогою якого ви надаєте ігровому об’єкту (game object) фізичну поведінку. Об’єкт колізій має фізичні властивості, як-от вага, коефіцієнт відновлення та тертя, а його просторові розміри визначаються однією або кількома формами, які ви додаєте до компонента. Defold підтримує такі типи об’єктів колізій:
- Статичні об’єкти
- Статичні об’єкти ніколи не рухаються, але динамічний об’єкт, що стикається зі статичним, реагує відскакуванням та/або ковзанням. Статичні об’єкти дуже зручні для створення нерухомої геометрії рівня (тобто землі та стін). Вони також потребують менше обчислювальних ресурсів, ніж динамічні об’єкти. Статичні об’єкти не можна переміщувати або змінювати іншим чином.
- Динамічні об’єкти
- Динамічні об’єкти симулює фізичний рушій. Рушій розв’язує всі колізії та застосовує сили, що виникають унаслідок них. Динамічні об’єкти підходять для об’єктів, які мають поводитися реалістично. Найчастіше на них впливають опосередковано: прикладаючи сили або змінюючи кутове демпфування й кутову швидкість, а також лінійне демпфування й лінійну швидкість. Також можна безпосередньо змінювати позицію та орієнтацію динамічного об’єкта, якщо в game.project увімкнено налаштування Allow Dynamic Transforms.
- Кінематичні об’єкти
- Кінематичні об’єкти реєструють колізії з іншими фізичними об’єктами, але фізичний рушій не виконує автоматичної симуляції. Розв’язувати колізії або ігнорувати їх маєте ви (докладніше). Кінематичні об’єкти дуже добре підходять для об’єктів, якими керує гравець або скрипт і для яких потрібен точний контроль фізичних реакцій, наприклад для персонажа гравця.
- Тригери
- Тригери — це об’єкти, які реєструють прості колізії. Тригери є полегшеними об’єктами колізій. Вони схожі на трасування променів тим, що зчитують стан фізичного світу, а не взаємодіють із ним. Вони підходять для об’єктів, яким потрібно лише зареєструвати влучання (наприклад, кулі), або як частина ігрової логіки, коли потрібно запускати певні дії після досягнення об’єктом певної точки. Тригери потребують менше обчислень, ніж кінематичні об’єкти, тому за можливості слід віддавати їм перевагу.
Додавання компонента об’єкта колізій
Компонент об’єкта колізій має набір властивостей, що визначають його тип і фізичні властивості. Він також містить одну або кілька форм, які визначають загальну форму фізичного об’єкта.
Щоб додати компонент об’єкта колізій до ігрового об’єкта:
- На панелі Outline клацніть правою кнопкою миші ігровий об’єкт і виберіть Add Component ▸ Collision Object у контекстному меню. Буде створено новий компонент без форм.
- Клацніть правою кнопкою миші новий компонент і виберіть Add Shape ▸ Box / Capsule / Sphere. Це додасть нову форму до компонента об’єкта колізій. Ви можете додати до компонента будь-яку кількість форм. Також можна визначити форму фізичного об’єкта за допомогою карти плиток або опуклої оболонки.
- Відредагуйте форми за допомогою інструментів переміщення, повороту та масштабування.
- Виберіть компонент на панелі Outline і відредагуйте властивості об’єкта колізій на панелі Properties.

Додавання форми колізій
Компонент колізій може використовувати кілька примітивних форм або одну складну. Докладніше про різні форми та їх додавання до компонента колізій читайте в посібнику з форм колізій.
Властивості об’єкта колізій
- Id
- Ідентифікатор компонента.
- Collision Shape
- Ця властивість використовується для геометрії карти плиток або опуклих форм, у яких не використовуються примітивні форми. Докладніше дивіться в посібнику з форм колізій.
- Type
- Тип об’єкта колізій:
Dynamic, Kinematic, Static або Trigger. Якщо ви встановлюєте для об’єкта тип Dynamic, то маєте задати ненульове значення властивості Mass. Для об’єктів типу Dynamic або Static також слід перевірити, чи підходять значення Friction та Restitution для вашого випадку використання.
- Friction
- Тертя дає змогу об’єктам реалістично ковзати один по одному. Значення тертя зазвичай задають у межах від
0 (повна відсутність тертя — дуже слизький об’єкт) до 1 (сильне тертя — шорсткий об’єкт). Однак допустимим є будь-яке додатне значення.
Сила тертя пропорційна силі нормальної реакції (це називається тертям Кулона). Під час обчислення сили тертя між двома формами (A і B) значення тертя обох об’єктів об’єднуються як середнє геометричне:
F = sqrt( F_A * F_B )
Це означає, що якщо один з об’єктів має нульове тертя, то й контакт між ними матиме нульове тертя.
- Restitution
- Коефіцієнт відновлення визначає «стрибучість» об’єкта. Значення зазвичай лежить у межах від 0 (непружна колізія — об’єкт зовсім не відскакує) до 1 (абсолютно пружна колізія — швидкість об’єкта точно віддзеркалюється під час відскоку).
Значення коефіцієнта відновлення двох форм (A і B) об’єднуються за такою формулою:
R = max( R_A, R_B )
Коли форма має кілька контактів, відновлення симулюється наближено, оскільки Box2D використовує ітераційний розв’язувач. Box2D також використовує непружні колізії за малої швидкості зіткнення, щоб запобігти тремтінню через відскоки.
- Linear damping
- Лінійне демпфування зменшує лінійну швидкість тіла. Воно відрізняється від тертя, яке виникає лише під час контакту, і може використовуватися, щоб створити враження плавання об’єктів, ніби вони рухаються крізь середовище, густіше за повітря. Допустимі значення лежать у межах від 0 до 1.
Box2D обчислює демпфування наближено задля стабільності та продуктивності. За малих значень ефект демпфування не залежить від кроку часу, тоді як за більших значень демпфування його ефект змінюється залежно від кроку часу. Якщо гра працює з фіксованим кроком часу, це ніколи не становить проблеми.
- Angular damping
- Кутове демпфування працює так само, як лінійне, але зменшує кутову швидкість тіла. Допустимі значення лежать у межах від 0 до 1.
- Locked rotation
- Увімкнення цієї властивості повністю вимикає обертання об’єкта колізій незалежно від прикладених до нього сил.
- Bullet
- Увімкнення цієї властивості активує безперервне виявлення колізій (CCD) між цим об’єктом колізій та іншими динамічними об’єктами колізій. Властивість Bullet ігнорується, якщо Type не має значення
Dynamic.
- Group
- Назва групи колізій, до якої має належати об’єкт. Ви можете мати 16 різних груп і називати їх так, як зручно для вашої гри. Наприклад,
players, bullets, enemies та world. Якщо для Collision Shape задано карту плиток, це поле не використовується, а назви груп беруться з джерела плиток. Докладніше про групи колізій.
- Mask
- Інші групи, з якими цей об’єкт має стикатися. Ви можете вказати одну групу або кілька груп у списку, розділеному комами. Якщо залишити поле Mask порожнім, об’єкт ні з чим не стикатиметься. Докладніше про групи колізій.
- Generate Collision Events
- Якщо ввімкнено, об’єкт зможе надсилати події колізій.
- Generate Contact Events
- Якщо ввімкнено, об’єкт зможе надсилати події контактів.
- Generate Trigger Events
- Якщо ввімкнено, об’єкт зможе надсилати події тригерів.
Властивості під час виконання
Фізичний об’єкт має низку властивостей, які можна читати й змінювати за допомогою go.get() та go.set():
angular_damping
- Значення кутового демпфування компонента об’єкта колізій (
number). Довідник API.
angular_velocity
- Поточна кутова швидкість компонента об’єкта колізій (
vector3). Довідник API.
linear_damping
- Значення лінійного демпфування об’єкта колізій (
number). Довідник API.
linear_velocity
- Поточна лінійна швидкість компонента об’єкта колізій (
vector3). Довідник API.
mass
- Задана фізична маса компонента об’єкта колізій. ЛИШЕ ДЛЯ ЧИТАННЯ. (
number). Довідник API.