事件分发机制也被称之为事件监听派发系统,在每个游戏框架中都是不可或缺的一个模块。起作用主要是用来解耦,监听网络消息,或者做一些异步的操作等,下面是使用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();
}
}