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; } } } }