3
votes

OnCollisionExit n'est pas appelé

Pourquoi OnCollisionExit n'est-il pas appelé? J'utilise à la fois OnCollisionEnter et OnCollisionExit mais malheureusement, seul OnCollisionEnter est appelé.

public bool HandleCollided = false;

public void OnCollisionEnter(Collision col)
{
    if(col.gameObject.name == "RightHandAnchor")
    {
        HandleCollided = true;
    }
}

public void OnCollisionExit(Collision col)
{
    if(col.gameObject.name == "RightHandAnchor")
    {
        HandleCollided = false;
    }
}


6 commentaires

Vous devez copier le code qui appelle vos fonctions si vous voulez que nous puissions vous aider


Les fonctions sont appelées par défaut car j'ai ajouté un collisionneur de boîte à l'objet et ce script au même objet. docs.unity3d.com/ScriptReference/…


Ho, je n'avais pas vu le drapeau de l'unité.


Modifiez-vous quelque chose dans le RigidBody ou autre chose dans votre scène (par exemple, la désactivation des collisionneurs, des objets) après OnCollisionEnter ?


Non, je ne modifie ou ne désactive rien de la scène ou du script.


Il y a deux objets qui entrent en collision. L'un a un collisionneur de sphères et un autre un collisionneur de boîte. Un des objets a également un corps rigide.


5 Réponses :


0
votes

Vous avez besoin d'un corps rigide non cinématique attaché à votre objet pour obtenir l'événement pour OnCollisionExit


1 commentaires

Cela ne répond pas vraiment à la question car sans lui aussi OnCollisionEnter ne serait pas appelé.



1
votes

Vous avez donc dit: "Il y a deux objets qui entrent en collision l'un avec l'autre. L'un a un collisionneur de sphères attaché et un autre a un collisionneur de boîte. L'un des objets a un corps rigide également attaché." Sur lequel est le code? et oui cela compte! seul 1 des objets gardera la trace de la sortie, ce qui signifie que si c'est la non-cinématique, cela ne fonctionnera pas.


1 commentaires

Le deuxième gameObject avec seulement un collisionneur de boîte attaché a le code.



3
votes

Il est impossible de dire pourquoi votre code ne fonctionne pas en fonction de l'extrait de code donné - ce code dépend de la configuration de chacune des fenêtres d'inspection GameObjects dans l'éditeur.

Le GameObject auquel ce script est attaché et le GameObject en collision doivent avoir un composant Collider attaché à chacun d'eux (par exemple , un composant BoxCollider ou un composant SphereCollider ). Les cases à cocher isTrigger des deux Colliders doivent être désactivées. Le GameObject auquel ce script est attaché doit également avoir un composant Rigidbody attaché.

Afin de déboguer cette situation, ajoutez Debug. Instructions Log () dans vos fonctions. C'est généralement une bonne pratique, et il se peut que la fonction soit appelée mais que l'instruction conditionnelle ne soit pas vraie.

Voici quelques idées supplémentaires sur ce qui pourrait ne pas se passer:

  • Vous êtes peut-être en train de changer le nom du GameObject en collision ailleurs dans votre code.
  • Vous êtes peut-être en train de détruire le GameObject .
  • Il se peut qu'aucune des fonctions n'ait été appelée et que HandleCollided ait été modifié ailleurs dans votre code.
  • Il se peut que le paramètre col ne corresponde pas à vos attentes.
public void OnCollisionEnter(Collision col)
{
    Debug.Log("Collision Enter!");
    Debug.Log(col.gameObject.name);
}
public void OnCollisionExit(Collision col)
{
    Debug.Log("Collision Exit!");
    Debug.Log(col.gameObject.name);
}


2 commentaires

Merci pour votre réponse détaillée. J'ai essayé de tout faire, c'est toujours le même résultat. (a) J'ai deux gameObjects. Le premier a un corps rigide qui lui est attaché avec des composants de gravité et de cinématique désactivés. Il a un composant de collisionneur de sphères attaché avec isTrigger désactivé. (b) Le deuxième gameObject a un collisionneur de boîte qui lui est attaché avec isTrigger désactivé. (c) Le script ci-dessus est attaché au deuxième gameObject. Je reçois le message "Collision Enter!" mais pas pour "Collision Exit!"


C'est étrange, merci d'avoir essayé le script. Il peut y avoir un paramètre physique quelque part dans Unity que je ne connais pas, mais vous saurez si vous avez changé quelque chose dans les paramètres de votre projet. Si vous rencontrez toujours des problèmes, essayez de configurer et d'exécuter le même script dans une nouvelle scène ou un nouveau projet, et si vous rencontrez toujours des problèmes, j'essaierais une nouvelle installation de Unity. Il est très peu probable que quelque chose ne va pas avec votre installation et provoque cela, mais au moins la configuration des objets à nouveau garantirait que ce n'est pas le problème.



1
votes

Malheureusement, l'utilisation d'OnCollisionExit ne fonctionnait pas, j'ai donc utilisé à la place OnTriggerEnter et OnTriggerExit. J'ai activé "isTrigger" pour les deux objets.

  public void OnTriggerEnter(Collider col)
{
    Debug.Log("entered");
    if (col.gameObject.name == "RightHandAnchor")
    {
        HandleCollided = true;
    }
}

public void OnTriggerExit(Collider other)
{
    Debug.Log("exit");
    if (other.gameObject.name == "RightHandAnchor")
    {

        print("No longer in contact with " + other.transform.name);
        HandleCollided = false;
    }
}


0 commentaires

0
votes

Essayez d'utiliser OnCollisionEnter () et OnTriggerExit () !!

Exemple:

void OnCollisionEnter(Collision collision)
    {
      if((collision.gameObject.GetComponent<AttributeManager>().attributes & doorType) != 0)
        {
            this.GetComponent<BoxCollider>().isTrigger = true;
        }
    }


private void OnTriggerExit(Collider other)
{
    this.GetComponent<BoxCollider>().isTrigger = false;
}


0 commentaires