You can simply pass the top object to the children and call a function directly on it. This guarantees that you don't have to rely on parent propagation. So you don't end up doing silly things like `transform.parent.parent.parent` You could however automate this process by looping trough each parent to check if a certain object contains the script that receives the call and cache that in your collision object. Then simply directly call functions on said cached object. Alternatively you could make use of UnityEvents ( don't use Messages ) to bind functions to the child object. With unity events you can add any arbitrary listener so you can do more than just notify the top level object of the child object being hit.