web-dev-qa-db-fra.com

OnCollisionEnter () ne fonctionne pas dans Unity3D

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.

13
Temp Id

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.

28
Peter de Rivaz

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.

example colider configuration

13
Ohad Cohen

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

5
lukegravitt

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.

1
Matt Baeriswyl

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!

1