title: Сообщения о столкновениях
Когда два объекта сталкиваются, движок передает сообщения всем компонентам обоих объектов.
Типы генерируемых событий могут управляться с помощью флагов для каждого объекта:
По умолчанию все они установлены в 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