Si estás usando un cuerpo rígido con el personaje, puedes sacarlo de la caja. :)
Entonces su jerarquía podría verse así:
- Personaje (tiene Rigidbody y script de control)
- niño (tal vez tiene colisionadores)
- nieto (tal vez tiene colisionadores)
Los mensajes OnCollisionEnter se dispararán en el GameObject que contiene el Rigidbody, llegando a su script de control principal sin necesidad de escribir un script de retransmisión adicional para pegar en cada colisionador.
Si necesita averiguar cuál de los colisionadores de su hijo estuvo involucrado en la colisión, puede hacerlo así:
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)
}
Simplemente puede pasar el objeto superior a los hijos y llamar a una función directamente sobre él. Esto garantiza que no tiene que depender de la propagación principal. Entonces no terminas haciendo cosas tontas como
transform.parent.parent
Sin embargo, podría automatizar este proceso con GetComponentInParent . Esto recupera el primer script que encuentra. Luego guarde en caché eso en su objeto de colisión, llame directamente a las funciones en dicho objeto en caché.
Alternativamente, puede hacer uso de UnityEvents (no use Messages) para vincular funciones al objeto secundario. Con los eventos de la unidad, puede agregar cualquier oyente arbitrario para que pueda hacer más que simplemente notificar al objeto de nivel superior del objeto secundario que está siendo golpeado.
fuente
Cita directa de Unity Answers (escrito por Ashish Dwivedi ):
fuente
Puede realizar una verificación de la colisión y ver qué caja de golpe se golpeó y también obtener el punto de impacto si es necesario.
nota: el cuerpo rígido se coloca en el mismo objeto que tiene la secuencia de comandos Collision Check.
Este ejemplo está comprobando para ver qué hitbox golpeó el 'proyectil' en un objetivo.
fuente