Unity事件分發器

       事件分發機制也被稱之爲事件監聽派發系統,在每個遊戲框架中都是不可或缺的一個模塊。起作用主要是用來解耦,監聽網絡消息,或者做一些異步的操作等,下面是使用C#在Unity遊戲開發中的事件分發處理機制的簡單實現,希望能幫到大家。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
/// <summary>
/// 文件名(File Name): EvtDispatcher.cs
/// 作者(Author): chenyang
/// 日期(Create Data): 
/// </summary>


/// <summary>
/// Author: cy
/// Description: 所有遊戲裏出現的事件
/// </summary>
public enum Events
{
    #region 手機事件
    Connect,
    #endregion

    #region 主要事件
    GameStart,
    GameFinish,
    #endregion

    #region 操作主要事件
    OpenControl,
    CloseControl,
    #endregion
}

public class EvtDispatcher
{

    static public Dictionary<Events, List<Action<object[]>>> evts = new Dictionary<Events, List<Action<object[]>>>();

    static public void AddListener(Events evt, Action<object[]> cb)
    {
        if (!evts.ContainsKey(evt))
        {
            evts.Add(evt,new List<Action<object[]>>());
        }
        evts[evt].Add(cb);
    }

    static public void Trigger(Events evt, params object[] param)
    {
        if (evts.ContainsKey(evt))
        {
            List<Action<object[]>> cbs = evts[evt];
            for (int i = cbs.Count - 1; i > -1; i--)
            {
                if (cbs[i] != null)
                {
                    try
                    {
                        cbs[i](param);
                    }
                    catch (Exception e)
                    {
                        Debug.LogError("Event is Trigger:" + evt.ToString() + ":" + e.ToString());
                    }
                }
                else
                {
                    Debug.LogError("evt is NULL!!");
                }
            }
        }
        else
        {
            Debug.LogError(evt.ToString() + " Event Is Not Add , Please Check Your Scripts!");
        }
    }

    static public void RemoveListener(Events evt, Action<object[]> cb)
    {
        if (evts.ContainsKey(evt))
        {
            for (int i = evts[evt].Count - 1; i > -1; i--)
            {
                if (evts[evt][i] == cb)
                {
                    evts[evt].Remove(cb);
                }
            }
        } 
    }

    static public void RemoveListener(Events evt)
    {
        if (evts.ContainsKey(evt))
        {
            evts[evt].Clear();
        }
    }

    static public void RemoveAllListener()
    {
        evts.Clear();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章