Jeśli używasz Rigidbody z postacią, możesz wyciągnąć to z pudełka. :)
Twoja hierarchia może wyglądać następująco:
- Postać (ma Sztywne ciało i skrypt sterujący)
- dziecko (może ma zderzaki)
Wiadomości OnCollisionEnter będą uruchamiane na GameObject zawierającym Rigidbody, docierając do rodzica skryptu kontrolnego bez potrzeby pisania dodatkowego skryptu przekazywania, aby przykleić się do każdego zderzacza.
Jeśli chcesz dowiedzieć się, który z twoich dzieci zderzających się uczestniczył w kolizji, możesz to zrobić w następujący sposób:
void OnCollisionEnter(Collision collision) {
Collider myCollider = collision.contacts[0].thisCollider;
// Now do whatever you need with myCollider.
// (If multiple colliders were involved in the collision,
// you can find them all by iterating through the contacts)
}
Możesz po prostu przekazać górny obiekt dzieciom i wywołać funkcję bezpośrednio na nim. Gwarantuje to, że nie musisz polegać na propagacji rodziców. Więc nie robisz głupich rzeczy
transform.parent.parent
Możesz jednak zautomatyzować ten proces za pomocą GetComponentInParent . Pobiera pierwszy znaleziony skrypt. Następnie buforuj to w swoim obiekcie kolizyjnym, bezpośrednio wywołuj funkcje na tym buforowanym obiekcie.
Alternatywnie możesz użyć UnityEvents (nie używaj Wiadomości) do powiązania funkcji z obiektem potomnym. Za pomocą zdarzeń jedności możesz dodać dowolny dowolny detektor, dzięki czemu możesz zrobić coś więcej niż tylko powiadomić obiekt najwyższego poziomu o trafieniu obiektu potomnego.
źródło
Bezpośredni cytat z Unity Answers (napisany przez Ashisha Dwivedi ):
źródło
Możesz sprawdzić kolizję i sprawdzić, które pole trafienia zostało trafione, a także w razie potrzeby uzyskać punkt uderzenia.
Uwaga: ciało sztywne jest umieszczane na tym samym obiekcie, który ma skrypt sprawdzania kolizji.
W tym przykładzie sprawdzono, który hitbox trafił „pocisk” w cel.
źródło