Если вы используете Rigidbody с персонажем, вы можете получить это из коробки. :)
Итак, ваша иерархия может выглядеть так:
- Персонаж (имеет Rigidbody и управляющий скрипт)
- ребенок (может быть, есть коллайдеры)
- внук (может быть, есть коллайдеры)
Сообщения OnCollisionEnter будут запускаться в GameObject, содержащем Rigidbody, достигая вашего родительского сценария управления без необходимости писать дополнительный сценарий ретрансляции, который будет прикреплен к каждому коллайдеру.
Если вам нужно выяснить, кто из ваших дочерних коллайдеров участвовал в столкновении, вы можете сделать это следующим образом:
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)
}
Вы можете просто передать верхний объект дочерним элементам и вызвать функцию непосредственно на нем. Это гарантирует, что вам не нужно полагаться на родительское распространение. Таким образом, вы не в конечном итоге делать глупые вещи, как
transform.parent.parent
Однако вы можете автоматизировать этот процесс с помощью GetComponentInParent . Это возвращает первый найденный скрипт. Затем кешируйте это в вашем объекте столкновения, непосредственно вызывайте функции для указанного кешируемого объекта.
В качестве альтернативы вы можете использовать UnityEvents (не используйте Messages) для привязки функций к дочернему объекту. С помощью событий единства вы можете добавить любого произвольного слушателя, чтобы вы могли сделать больше, чем просто уведомить объект верхнего уровня о попадании дочернего объекта.
источник
Прямая цитата из ответов Unity (написанных Ашишем Двиведи ):
источник
Вы можете выполнить проверку столкновения и посмотреть, в какой хит-бокс попали, а также получить точку удара, если это необходимо.
примечание: жесткое тело размещается на том же объекте, на котором установлен скрипт Collision Check.
Этот пример проверяет, какой хитбокс «снаряд» попал в цель.
источник