private void _DispatchEvent(string name, ref bool pool, ref Event_ e) { if (destroyed) { return; } var queue = m_states.Get(name); if (queue >= EventManager.MAX_ALLOWED_QUEUE) { Logger.LogError("EventDispatcher event [{0}] reached the max allowed event recursion queue size, this may cause stack overflow, ignored. Max allowed queue size: [{1}]", name, EventManager.MAX_ALLOWED_QUEUE); #if UNITY_EDITOR UnityEditor.EditorApplication.isPaused = true; #endif return; } var glss = EventManager.GetGlobalListeners(name); var lss = m_listeners.Get(name); int size = lss == null ? 0 : lss.Count, gsize = glss == null ? 0 : glss.Count, total = size + gsize; if (total < 1) { return; } m_states[name] = queue + 1; var ss = m_dispatchStates.Get(name); if (ss == null) { ss = new DispatchState[EventManager.MAX_ALLOWED_QUEUE]; for (var i = 0; i < ss.Length; ++i) { ss[i] = new DispatchState(); } m_dispatchStates.Add(name, ss); } var s = ss[queue]; s.Set(size, gsize, total, 0); if (gsize > 0) { EventManager.AddLinkedState(name, s); } dispatchCount++; dispatching = true; if (e == null) { e = Event_.defaultEvent; pool = true; } e.SetInfo(name, this, false, true); for (; s.i < s.t; ++s.i) { var ls = s.i < s.s ? lss[s.i] : glss[s.i - s.s]; if (!ls || !ls.Invoke(e)) { continue; } if (destroyed || e.cancle) { break; } } if (gsize > 0) { EventManager.RemoveLinkedState(name, s); } glss = null; dispatching = --dispatchCount < 1; if (destroyed) { return; } queue = m_states[name] - 1; m_states[name] = queue; }