Pensez à manipuler vos couches lors de l'exécution.
Activation / désactivation des collisions pour certains objets avec des calques entiers
Physics.IgnoreCollision et Physics.IgnoreLayerCollision vous permettent de désactiver les collisions entre deux collisionneurs et entre deux couches, respectivement.
Si vous souhaitez exclure un collisionneur spécifique des collisions, il n'y a aucun moyen intégré de le faire. Si vous utilisez des corps rigides non cinématiques avec des collisionneurs non déclencheurs, il y aura toujours une réponse même si vous essayez de filtrer les réponses par balise.
La façon dont nous avons accompli cela sur notre projet était de créer une couche nommée "Void". Le néant n'entre en collision avec rien du tout.
Vous pouvez maintenant désactiver temporairement la collision d'un collisionneur en définissant son calque sur "Void" et le réactiver en restaurant son ancien calque.
Voici l'essentiel:
int oldLayer = -1;
int voidLayer;
void Start()
{
voidLayer = LayerMask.NameToLayer("Void");
}
void DisableCollider(Collider col)
{
oldLayer = col.gameObject.layer;
col.gameObject.layer = voidLayer;
}
void EnableCollider(Collider col)
{
col.gameObject.layer = oldLayer;
}
Nous l'avons fait spécifiquement parce que l'activation et la désactivation des collisionneurs qui étaient des enfants de corps rigides peuvent vraiment gâcher les choses dans certaines circonstances. Vous ne pouvez donc pas désactiver de manière fiable une partie d'un collisionneur à corps rigide composé, mais vous pouvez échanger de manière fiable autour de la couche de l'une des parties du collisionneur composé.
Maintenant votre situation spécifique
Pour réduire l'impact de la collision de zombies sur votre voiture, envisagez de faire des déclencheurs cinématiques rigides de vos zombies, ou de rendre leur masse très très petite (comme float.Epsilon), de sorte que l'impact n'a aucun effet sur l'élan de la voiture. À l'impact, vous pouvez également effectuer ce changement de couche, de sorte que les collisions ultérieures ne soient pas déclenchées, même si la première applique une force négligeable à la carrosserie.
Vous pouvez même les passer à une couche qui n'entre pas en collision avec la voiture.
Vous pouvez également mettre un autre collisionneur sur des zombies qui s'activent lors d'un survol. De cette façon, vous pouvez simuler les forces d'impact OnTriggerEnter. Vous ne pouvez pas être aussi précis avec cela, mais vous pouvez approximer où les normales de contact ont été assez bien pour jeter le zombie dans un endroit amusant.
Vous devez vous demander:
Est-ce que je veux pouvoir renverser les zombies renversés avec ma voiture, ou devraient-ils simplement jouer une animation de mort?
Est-ce que je me soucie si la vitesse et la vitesse angulaire de la voiture sont affectées de manière plus petite en frappant des zombies?