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?
Je suppose que vous pouvez vérifier les noms des objets, ou ajouter une valeur de nom aux classes d'objets, puis vérifier cela?
Ensuite, ayez simplement une autre variable que vous pouvez utiliser pour vérifier le renforcement et l'ajouter aux contrôles.
EDIT: a ajouté cette variable dans.
la source
Je suppose que vous utilisez le moteur physique pour faire la «déviation» automatiquement en fonction de la forme / masse lorsque les choses entrent en collision? si tel est le cas, changez la masse de vos zombies à une valeur très minimale et ils n'affecteront pas la voiture.
la source
Il existe deux classes de réponses ici:
J'espère que cela t'aides!
la source