Se você estiver usando um corpo rígido com o personagem, poderá tirá-lo da caixa. :)
Portanto, sua hierarquia pode ficar assim:
- Personagem (possui corpo rígido e script de controle)
- criança (talvez tenha colisores)
- neto (talvez tenha colisores)
As mensagens OnCollisionEnter serão acionadas no GameObject que contém o Rigidbody, atingindo o script de controle pai sem a necessidade de escrever um script de retransmissão extra para colar em cada colisor.
Se você precisar descobrir qual colisor de filhos estava envolvido na colisão, faça o seguinte:
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)
}
Você pode simplesmente passar o objeto superior para os filhos e chamar uma função diretamente nele. Isso garante que você não precisa confiar na propagação dos pais. Então você não acaba fazendo coisas tolas como
transform.parent.parent
No entanto, você pode automatizar esse processo com GetComponentInParent . Isso recupera o primeiro script encontrado. Em seguida, armazene em cache isso no seu objeto de colisão, chame diretamente funções no referido objeto em cache.
Como alternativa, você pode usar o UnityEvents (não use Mensagens) para vincular funções ao objeto filho. Com os eventos de unidade, você pode adicionar qualquer ouvinte arbitrário para poder fazer mais do que apenas notificar o objeto de nível superior do objeto filho que está sendo atingido.
fonte
Citação direta da Unity Answers (escrita por Ashish Dwivedi ):
fonte
Você pode verificar a colisão e ver qual caixa de ocorrências foi atingida e também obter o ponto de impacto, se necessário.
nota: o corpo rígido é colocado no mesmo objeto que possui o script de verificação de colisão.
Este exemplo está verificando para qual hitbox o 'projétil' atingiu um alvo.
fonte