void FillData(TriggerData data, TriggerDetectee detectee)
 {
     data.triggerDetectee = detectee;
     data.triggerDetector = this;
     data.otherTagHolder  = detectee.TagHolder;
     data.otherTransform  = detectee.transform;
     data.otherGameObject = detectee.gameObject;
 }
    void InvokeTriggerEvent(Collider other, TriggerDataEvent e, bool isEnter)
    {
        Rigidbody otherRigidbody = other.attachedRigidbody;

        TriggerDetectee detectee = null;

        TriggerData data = new TriggerData();

        bool hasEntered = false;
        bool hasExited  = false;

        if (!rigidbodyCompositeMode)
        {
            if (!prioritiseRigidbody)
            {
                detectee = other.GetComponent <TriggerDetectee>();

                if (detectee != null)
                {
                    FillData(data, detectee);

                    if (isEnter)
                    {
                        detectee.NotifyTriggerEnter(this, gameObject);
                    }
                    else
                    {
                        detectee.NotifyTriggerExit(this, gameObject);
                    }

                    e.Invoke(data);

                    return;
                }

                if (otherRigidbody != null)
                {
                    detectee = otherRigidbody.GetComponent <TriggerDetectee>();

                    if (detectee != null)
                    {
                        FillData(data, detectee);

                        if (isEnter)
                        {
                            detectee.NotifyTriggerEnter(this, gameObject);
                        }
                        else
                        {
                            detectee.NotifyTriggerExit(this, gameObject);
                        }

                        e.Invoke(data);
                    }
                }
            }
            else
            {
                if (otherRigidbody != null)
                {
                    detectee = otherRigidbody.GetComponent <TriggerDetectee>();

                    if (detectee != null)
                    {
                        if (isEnter)
                        {
                            detectee.NotifyTriggerEnter(this, gameObject);
                        }
                        else
                        {
                            detectee.NotifyTriggerExit(this, gameObject);
                        }
                        FillData(data, detectee);
                        e.Invoke(data);

                        return;
                    }
                }

                detectee = other.GetComponent <TriggerDetectee>();

                if (detectee != null)
                {
                    FillData(data, detectee);

                    if (isEnter)
                    {
                        detectee.NotifyTriggerEnter(this, gameObject);
                    }
                    else
                    {
                        detectee.NotifyTriggerExit(this, gameObject);
                    }

                    e.Invoke(data);
                }
            }
        }
        else
        {
            if (otherRigidbody != null)
            {
                if (isEnter)
                {
                    if (!rigidbodyDictionary.ContainsKey(otherRigidbody))
                    {
                        rigidbodyDictionary.Add(otherRigidbody, new List <Collider>()
                        {
                            other
                        });
                        hasEntered = true;
                    }
                    else
                    {
                        rigidbodyDictionary[otherRigidbody].Add(other);
                    }
                }
                else
                {
                    if (rigidbodyDictionary.ContainsKey(otherRigidbody))
                    {
                        rigidbodyDictionary[otherRigidbody].Remove(other);

                        if (rigidbodyDictionary[otherRigidbody].Count == 0)
                        {
                            rigidbodyDictionary.Remove(otherRigidbody);
                            hasExited = true;
                        }
                    }
                }

                detectee = otherRigidbody.GetComponent <TriggerDetectee>();

                if (detectee != null)
                {
                    if (hasEntered && isEnter)
                    {
                        detectee.NotifyTriggerEnter(this, gameObject);
                        FillData(data, detectee);
                        e.Invoke(data);
                    }
                    else if (hasExited && !isEnter)
                    {
                        detectee.NotifyTriggerExit(this, gameObject);
                        FillData(data, detectee);
                        e.Invoke(data);
                    }
                    return;
                }
            }
        }
    }