void OnTriggerExit(Collider col)
    {
        Rigidbody rb = Tools.FindInParents <Rigidbody>(col.transform);

        if (rb != null && !rb.isKinematic)
        {
            foreach (Entry ent in mList)
            {
                if (ent.rb == rb)
                {
                    if (--ent.counter <= 0)
                    {
                        mList.Remove(ent);

                        for (int i = mOnExit.Count; i > 0;)
                        {
                            TriggerListener listener = mOnExit[--i];
                            if (listener.mb == null || !listener.callback(rb))
                            {
                                mOnExit.RemoveAt(i);
                            }
                        }
                    }
                    return;
                }
            }
        }
    }
    void OnTriggerEnter(Collider col)
    {
        Rigidbody rb = Tools.FindInParents <Rigidbody>(col.transform);

        if (rb != null && !rb.isKinematic)
        {
            foreach (Entry ent in mList)
            {
                if (ent.rb == rb)
                {
                    ++ent.counter;
                    return;
                }
            }

            Entry e = new Entry();
            e.rb      = rb;
            e.counter = 1;
            mList.Add(e);

            for (int i = mOnEnter.Count; i > 0;)
            {
                TriggerListener listener = mOnEnter[--i];
                if (listener.mb == null || !listener.callback(rb))
                {
                    mOnEnter.RemoveAt(i);
                }
            }
        }
    }