Exemplo n.º 1
0
    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;
    }