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
. Когда два коллизийных объекта взаимодействуют, движок проверяет, следует ли отправлять сообщение пользователю, основываясь на этих флагах.
Например, с флажками “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
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB