This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Коли два об’єкти стикаються, рушій надсилає подію до функції зворотного виклику обробки подій або розсилає повідомлення обом об’єктам.
Типами подій, що генеруються, можна керувати за допомогою прапорців для кожного об’єкта:
За замовчуванням усі вони мають значення true.
Коли два об’єкти колізій (collision objects) взаємодіють, рушій перевіряє, чи слід надсилати повідомлення користувачеві, зважаючи на ці прапорці.
Наприклад, для прапорців “Generate Contact Events”:
Якщо використовується physics.set_event_listener():
| Компонент A | Компонент B | Надсилати повідомлення |
|---|---|---|
| ✅︎ | ✅︎ | Так |
| ❌ | ✅︎ | Так |
| ✅︎ | ❌ | Так |
| ❌ | ❌ | Ні |
Якщо використовується обробник повідомлень за замовчуванням:
| Компонент A | Компонент B | Надсилати повідомлення |
|---|---|---|
| ✅︎ | ✅︎ | Так (A,B) + (B,A) |
| ❌ | ✅︎ | Так (B,A) |
| ✅︎ | ❌ | Так (A,B) |
| ❌ | ❌ | Ні |
Повідомлення "collision_response" надсилається, коли один з об’єктів, що стикаються, має тип “dynamic”, “kinematic” або “static”. У ньому задано такі поля:
other_idhash)other_positionvector3)other_grouphash)own_grouphash)Повідомлення collision_response підходить лише для обробки колізій, коли не потрібні подробиці фактичного перетину об’єктів, наприклад, якщо ви хочете визначити, чи влучила куля у ворога. Для кожної пари об’єктів, що стикаються, за кадр надсилається лише одне таке повідомлення.
function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("collision_response") then
-- take action
print("I collided with", message.other_id)
end
end
Повідомлення "contact_point_response" надсилається, коли один з об’єктів, що стикаються, має тип “dynamic” або “kinematic”, а інший — “dynamic”, “kinematic” або “static”. У ньому задано такі поля:
positionvector3).normalvector3).relative_velocityvector3).distancenumber).applied_impulsenumber).life_timenumber).massnumber).other_massnumber).other_idhash).other_positionvector3).other_grouphash).own_grouphash).Для гри чи застосунку, де потрібно повністю розділити об’єкти, повідомлення "contact_point_response" надає всю необхідну інформацію. Однак зауважте, що для кожної пари об’єктів, що стикаються, за кадр може надходити кілька повідомлень "contact_point_response" залежно від характеру колізії. Докладніше див. у посібнику з розв’язання колізій.
function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("contact_point_response") then
-- take action
if message.other_mass > 10 then
print("I collided with something weighing more than 10 kilos!")
end
end
end
Повідомлення "trigger_response" надсилається, коли один з об’єктів, що стикаються, має тип “trigger”. Повідомлення надсилається один раз, коли колізію виявлено вперше, і ще раз, коли об’єкти більше не стикаються. Воно має такі поля:
other_idhash).entertrue, якщо взаємодія була входом у тригер, false, якщо це був вихід. (boolean).other_grouphash).own_grouphash).function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("trigger_response") then
if message.enter then
-- take action for entry
print("I am now inside", message.other_id)
else
-- take action for exit
print("I am now outside", message.other_id)
end
end
end