--- title: Сообщения о столкновениях brief: Когда два объекта сталкиваются, движок передает сообщения всем компонентам обоих объектов. --- # Сообщения о столкновениях Когда два объекта сталкиваются, движок передает сообщения всем компонентам обоих объектов: ## Реакция на столкновение Сообщение `"collision_response"` посылается всем объектам столкновения. У него имеются следующий набор полей: `other_id` : идентификатор экземпляра объекта столкновения, с которым произошло столкновение (`hash`) `other_position` : позиция в пространстве мира объекта столкновения, с которым произошло столкновение (`vector3`) `other_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`). `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". В столкновении с триггером посылаются сообщения `"collision_response"`. Дополнительно, триггеры также посылают специальные сообщения `"trigger_response"`, когда коллизия начинается и заканчивается. Сообщение содержит следующие поля: `other_id` : идентификатор экземпляра, с которым столкнулся объекта столкновения (`hash`). `enter` : `true` --- если взаимодействие было вхождением в триггер, `false` --- если это был выход из него (`boolean`). ```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 ```