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
Kiedy dwa obiekty kolizji pozostają w kontakcie, silnik wysyła zdarzenia do ich komponentów. Na przykład, wiadomość może być dostarczona do funkcji zwrotnej obsługi zdarzeń (physics.set_event_listener()) albo trafić do domyślnego odbiorcy wiadomości za pomocą on_message().
Rodzaje generowanych zdarzeń kontrolujesz przez przełączniki dla każdego obiektu kolizji:
Wszystkie są domyślnie ustawione na true. Gdy dwa obiekty kolizji wchodzą w interakcję, sprawdzamy te przełączniki, żeby zdecydować, czy wysłać wiadomość do gry.
Przykład dla zaznaczonych opcji “Generate Contact Events”:
Gdy korzystasz z physics.set_event_listener():
| Komponent A | Komponent B | Wyślij wiadomość |
|---|---|---|
| ✅︎ | ✅︎ | Tak |
| ❌ | ✅︎ | Tak |
| ✅︎ | ❌ | Tak |
| ❌ | ❌ | Nie |
Podstawowy handler wiadomości zachowuje się trochę inaczej:
| Komponent A | Komponent B | Wyślij wiadomość(y) |
|---|---|---|
| ✅︎ | ✅︎ | Tak (A,B) + (B,A) |
| ❌ | ✅︎ | Tak (B,A) |
| ✅︎ | ❌ | Tak (A,B) |
| ❌ | ❌ | Nie |
Wiadomość “collision_response” jest wysyłana, gdy przynajmniej jeden z kolidujących obiektów ma typ “dynamic”, “kinematic” lub “static”. Zawiera następujące pola:
other_idhash).other_positionvector3).other_grouphash).own_grouphash).Wiadomość “collision_response” nadaje się do prostych detekcji kolizji, kiedy nie potrzebujesz szczegółów przecięcia, np. gdy chcesz sprawdzić, czy pocisk trafił wroga. W ciągu jednej klatki zostaje wysłana tylko jedna taka wiadomość dla każdej pary obiektów.
function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("collision_response") then
-- take action
print("I collided with", message.other_id)
end
end
Wiadomość “contact_point_response” jest wysyłana wtedy, gdy jeden z kolidujących obiektów ma typ “dynamic” lub “kinematic”, a drugi może być “dynamic”, “kinematic” lub “static”. Oto zestaw dostępnych pól:
positionvector3).normalvector3).relative_velocityvector3).distancenumber).applied_impulsenumber).life_timenumber).massnumber).other_massnumber).other_idhash).other_positionvector3).other_grouphash).own_grouphash).Dla zastosowań wymagających najwyższej precyzji wiadomość “contact_point_response” dostarcza wszystkie potrzebne dane. Zwróć uwagę, że dla jednej pary kolidujących obiektów możesz otrzymać kilka takich wiadomości w jednej klatce, zależnie od natury kolizji. Zobacz Resolving collisions for more information.
function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("contact_point_response") then
-- take action
if message.other_mass > 10 then
print("I collided with something weighing more than 10 kilos!")
end
end
end
Wiadomość “trigger_response” jest wysyłana, gdy jeden z kolidujących obiektów ma typ “trigger”. Występuje raz na początku kolizji i raz po jej zakończeniu. Zawiera ona następujące pola:
other_idhash).entertrue, jeśli wejście było wejściem do wyzwalacza, false, jeśli było wyjściem (boolean).other_grouphash).own_grouphash).function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("trigger_response") then
if message.enter then
-- take action for entry
print("I am now inside", message.other_id)
else
-- take action for exit
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