--- title: Сообщения о столкновениях brief: Когда два объекта сталкиваются, движок передает сообщения всем компонентам обоих объектов. --- # Сообщения о столкновениях Когда два объекта сталкиваются, движок передает сообщения всем компонентам обоих объектов. ## Фильтрация событий Типы генерируемых событий могут управляться с помощью флагов для каждого объекта: * "Generate Collision Events" * "Generate Contact Events" * "Generate Trigger Events" По умолчанию все они установлены в `true`. Когда два коллизийных объекта взаимодействуют, движок проверяет, следует ли отправлять сообщение пользователю, основываясь на этих флагах. Например, с флажками "Generate Contact Events": Если используется `physics.set_listener()`: | Компонент A | Компонент B | Отправить сообщение | |-------------|-------------|----------------------| | ✅︎ | ✅︎ | Да | | ❌ | ✅︎ | Да | | ✅︎ | ❌ | Да | | ❌ | ❌ | Нет | Если используется обработчик сообщений по умолчанию: | Компонент A | Компонент B | Отправляемые сообщения | |-------------|-------------|----------------------------| | ✅︎ | ✅︎ | Да (A,B) и (B,A) | | ❌ | ✅︎ | Да (B,A) | | ✅︎ | ❌ | Да (A,B) | | ❌ | ❌ | Нет | ## Реакция на столкновение Сообщение `"collision_response"` посылается всем объектам столкновения. У него имеются следующий набор полей: `other_id` : идентификатор экземпляра объекта столкновения, с которым произошло столкновение (`hash`) `other_position` : позиция в пространстве мира объекта столкновения, с которым произошло столкновение (`vector3`) `other_group` : группа столкновения другого объекта столкновения (`hash`) `own_group` : группа столкновений собственного объекта столкновения (`hash`) Само по себе сообщение `collision_response` имеет смысл только для принятия решений по столкновениям, в которых вы не хотите знать деталей о реальном пересечении объектов, например, если вы хотите определить, поразила ли пуля врага. В каждом кадре только по одному сообщению такого вида посылается для каждой пары столкнувшихся объектов. ```Lua function on_message(self, message_id, message, sender) -- проверка сообщения if message_id == hash("collision_response") then -- предпринимаем действие print("I collided with", message.other_id) end end ``` ## Реакция точки контакта Сообщение `"contact_point_response"` посылается, когда одна из групп столкновения динамическая или кинематическая. В нем содержится следующий набор полей: `position` : позиция точки контакта в пространстве мира (`vector3`). `normal` : вектор нормали точки контакта в пространстве мира, который указывает от другого объекта к текущему (`vector3`). `relative_velocity` : относительная скорость объекта столкновения наблюдаемая со стороны другого объекта (`vector3`). `distance` : длина проникновения между объектами, неотрицательное число (`number`). `applied_impulse` : результирующее значение импульса при контакте (`number`). `life_time` : (*не используется в данный момент!*) время жизни контакта (`number`). `mass` : масса текущего объекта столкновения в килограммах (`number`). `other_mass` : масса другого объекта столкновения в килограммах (`number`). `other_id` : идентификатор экземпляра объекта, с которым объект столкновения находится в контакте (`hash`). `other_position` : позиция другого объекта столкновения в пространстве мира (`vector3`). `other_group` : группа столкновений другого объекта столкновения (`hash`) `own_group` : группа столкновений собственного объекта столкновения (`hash`) Для игры или приложения, где необходимо идеально отделить объекты, сообщение `"contact_point_response"` дает всю необходимую для этого информацию. Однако, стоит заметить, что для любой пары столкновения, каждый кадр могут присылаться несколько сообщений `"contact_point_response"`, в зависимости от природы столкновения. За подробностями обращайтесь к [ руководству по разрешению столкновений](/manuals/physics-resolving-collisions). ```Lua function on_message(self, message_id, message, sender) -- проверка сообщения if message_id == hash("contact_point_response") then -- предпринимаем действие if message.other_mass > 10 then print("I collided with something weighing more than 10 kilos!") end end end ``` ## Реакция триггера Сообщение `"trigger_response"` посылается, когда один из столкнувшихся объектов имеет тип "trigger". Оно отправляется один раз при начале столкновения и ещё раз при завершении. В сообщении содержатся следующие поля: `other_id` : идентификатор экземпляра, с которым столкнулся объекта столкновения (`hash`). `enter` : `true` --- если взаимодействие было вхождением в триггер, `false` --- если это был выход из него (`boolean`). `other_group` : группа столкновений другого объекта столкновения (`hash`) `own_group` : группа столкновений собственного объекта столкновения (`hash`) ```Lua function on_message(self, message_id, message, sender) -- проверка сообщения if message_id == hash("trigger_response") then if message.enter then -- предпринимаем действие для входа print("I am now inside", message.other_id) else -- предпринимаем действие для выхода print("I am now outside", message.other_id) end end end ```