Collision returned from OnCollisionEnter2D and OnCollisionExit2D are not the same

Hey there !

I’m trying to keep a list of the colliders from an object by simply doing:

[HideInInspector] public List<Collision2D> colliders = new List<Collision2D>();

    private void OnCollisionEnter2D(Collision2D collision)
    {
        Debug.Log("enter " + collision.transform);
        colliders.Add(collision);
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        Debug.Log("exit "+collision.transform);
        colliders.Remove(collision);
    }

I can see that the 2 events are called as expected and the printed value seems identical between the enter and the exit.

However, the Add works fine but the Remove don’t apply (I tried to check with a Contain and it doesn’t work either)

Any ideas ?

Hello @YoshK !

It took me a while, but I realized the problem.

You cannot access the “collision” in the first function from the other function. Therefore, “colliders.Remove(collision)” refers to the collision in the second function, which is not even in the list. In order the remove it, you need to access the list by doing:

    public List<Collision2D> colliders = new List<Collision2D>();
    private void OnCollisionEnter2D(Collision2D collision)
    {
        Debug.Log("Enter, " + collision.transform);
        colliders.Add(collision);
        Debug.Log(colliders.Count);
    }
    private void OnCollisionExit2D(Collision2D collision)
    {
        Debug.Log("Exit, " + collision.transform);
        for (int x = 0; x < colliders.Count; x++) //x increases until it reaches the last element of the list
        {
            if(colliders[x].gameObject.name == collision.gameObject.name) //checks if every item in the list matches with the name of the collision
            {
                colliders.Remove(colliders[x]); //removes gameObject if the name matches
            }
        }

    }

I hope this helped!