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

Сообщения о столкновениях

Когда два объекта сталкиваются, движок передает сообщения всем компонентам обоих объектов.

Фильтрация событий

Типы генерируемых событий могут управляться с помощью флагов для каждого объекта:

  • “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 имеет смысл только для принятия решений по столкновениям, в которых вы не хотите знать деталей о реальном пересечении объектов, например, если вы хотите определить, поразила ли пуля врага. В каждом кадре только по одному сообщению такого вида посылается для каждой пары столкнувшихся объектов.

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", в зависимости от природы столкновения. За подробностями обращайтесь к руководству по разрешению столкновений.

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)
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