J'ai un objet avec un collisionneur de mailles et un préfabriqué avec collisionneur de sphères. Je veux que l'instance du préfabriqué soit détruite si les deux se heurtent.
J'ai écrit ce qui suit dans un script:
private void OnCollisionEnter(Collision c)
{
if (c == target)
Destroy(transform.gameObject);
print("something"); // Doesn't get printed
}
Mais ça ne fonctionne pas. J'ai essayé de basculer isTrigger
sur les deux objets.
J'ai eu le même problème de OnCollisionEnter
de ne pas être appelé et j'ai trouvé cette question.
Pour moi, le problème était que je faisais un jeu 2D donc la réponse est d'utiliser le OnCollisionEnter2D
fonctionne à la place.
Jetez un oeil à ce tablea
Si vous voulez que votre OnCollisionEnter
soit appelé, assurez-vous:
(a) Les deux objets ont un collisionneur attaché.
(b) Aucun des objets n'est un collisionneur déclencheur (cela émettra la fonction OnTrigger et non OnCollisionEnter)
(c) L'un des objets (peu importe lequel d'entre eux) est un objet rigide, non cinématique et non statique (le second n'a pas à être un corps rigide).
(d) En raison de difficultés de calcul, MeshCollider peut avoir des difficultés à entrer en collision avec un autre collisionneur de mailles, utilisez-les avec prudence.
(e) Assurez-vous que les deux objets sont dans le même calque.
Assurez-vous que l'un d'eux a un corps rigide non cinématique attaché. Extrait des documents Unity:
Lorsqu'une collision entre deux collisionneurs se produit et si au moins l'un d'eux a un Rigidbody attaché , trois messages de collision sont envoyés aux objets qui leur sont attachés. Ces événements peuvent être gérés dans des scripts et vous permettent de créer des comportements uniques avec ou sans utilisation du moteur NVIDIA PhysX intégré.
À partir d'ici: nity3D MeshCollider
Avez-vous essayé d'utiliser la classe OnTriggerEnter () et de définir un collisionneur sur l'objet sur un déclencheur?
S'il n'a pas besoin de dire avec quel objet il entre en collision avec vous, vous pouvez faire un simple
void OnTriggerEnter(){
Destroy(transform.gameObject);
}
Éditer:
J'ai aussi fait OnCollision comme ça
private string hitobject;
void OnCollisionEnter(UnityEngine.Collision hit)
{
hitobject = hit.gameObject.tag;
if(hitobject == "Plane")
{
isgrounded = true;
}
}
Aucun des objets n'est un déclencheur et ils n'ont pas besoin de corps ridicules pour fonctionner.
J'avais un problème similaire. Le collisionneur de caisses n'était pas aussi gros que l'objet de collision. Régler les valeurs x et z sur 2 unités a résolu le problème!