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
Quando dois objetos colidem, a engine enviará um evento para o callback de evento ou transmitirá mensagens para ambos os objetos.
Os tipos de eventos gerados podem ser controlados usando as flags de cada objeto:
Todas elas são true por padrão.
Quando dois objetos de colisão interagem, verificamos se devemos enviar uma mensagem ao usuário, dadas essas caixas de seleção.
Por exemplo, considerando as caixas de seleção “Generate Contact Events”:
Ao usar physics.set_event_listener():
| Componente A | Componente B | Enviar mensagem |
|---|---|---|
| ✅︎ | ✅︎ | Sim |
| ❌ | ✅︎ | Sim |
| ✅︎ | ❌ | Sim |
| ❌ | ❌ | Não |
Ao usar o tratador de mensagens padrão:
| Componente A | Componente B | Enviar mensagem(ns) |
|---|---|---|
| ✅︎ | ✅︎ | Sim (A,B) + (B,A) |
| ❌ | ✅︎ | Sim (B,A) |
| ✅︎ | ❌ | Sim (A,B) |
| ❌ | ❌ | Não |
A mensagem "collision_response" é enviada quando um dos objetos em colisão é do tipo “dynamic”, “kinematic” ou “static”. Ela tem os seguintes campos definidos:
other_idhash)other_positionvector3)other_grouphash)own_grouphash)A mensagem collision_response só é adequada para resolver colisões em que você não precisa de detalhes sobre a interseção real dos objetos, por exemplo, se quiser detectar se uma bala atinge um inimigo. Apenas uma dessas mensagens é enviada para qualquer par de objetos em colisão a cada frame.
function on_message(self, message_id, message, sender)
-- verifica a mensagem
if message_id == hash("collision_response") then
-- executa uma ação
print("I collided with", message.other_id)
end
end
A mensagem "contact_point_response" é enviada quando um dos objetos em colisão é do tipo “dynamic” ou “kinematic” e o outro é do tipo “dynamic”, “kinematic” ou “static”. Ela tem os seguintes campos definidos:
positionvector3).normalvector3).relative_velocityvector3).distancenumber).applied_impulsenumber).life_timenumber).massnumber).other_massnumber).other_idhash).other_positionvector3).other_grouphash).own_grouphash).Para um jogo ou aplicação em que você precisa separar objetos perfeitamente, a mensagem "contact_point_response" fornece todas as informações necessárias. No entanto, observe que, para qualquer par de colisão específico, várias mensagens "contact_point_response" podem ser recebidas a cada frame, dependendo da natureza da colisão. Consulte Resolvendo colisões para mais informações.
function on_message(self, message_id, message, sender)
-- verifica a mensagem
if message_id == hash("contact_point_response") then
-- executa uma ação
if message.other_mass > 10 then
print("I collided with something weighing more than 10 kilos!")
end
end
end
A mensagem "trigger_response" é enviada quando um dos objetos em colisão é do tipo “trigger”. A mensagem será enviada uma vez quando a colisão for detectada pela primeira vez e mais uma vez quando os objetos deixarem de colidir. Ela tem os seguintes campos:
other_idhash).entertrue se a interação foi uma entrada no gatilho, false se foi uma saída. (boolean).other_grouphash).own_grouphash).function on_message(self, message_id, message, sender)
-- verifica a mensagem
if message_id == hash("trigger_response") then
if message.enter then
-- executa ação de entrada
print("I am now inside", message.other_id)
else
-- executa ação de saída
print("I am now outside", message.other_id)
end
end
end