简单消息机制
通过使用封装好的 Action 实现简单消息机制:
public class EventCenter : Singleton<EventCenter>
{
private Dictionary<string, Action<object[]>> EventDic = new Dictionary<string, Action<object[]>>();
protected override void Init()
{
base.Init();
}
/// <summary>
/// 注册事件
/// </summary>
/// <param name="eventName"></param>
/// <param name="action"></param>
public void Register(string eventName, Action<object[]> action)
{
if (EventDic.ContainsKey(eventName)) EventDic[eventName] += action;
else EventDic.Add(eventName, action);
}
/// <summary>
/// 移除事件
/// </summary>
/// <param name="eventName"></param>
/// <param name="action"></param>
public void Remove(string eventName, Action<object[]> action)
{
if (EventDic.ContainsKey(eventName))
{
EventDic[eventName] -= action;
if (EventDic[eventName] == null)
{
EventDic.Remove(eventName);
}
}
}
/// <summary>
/// 唤醒事件
/// </summary>
/// <param name="eventName"></param>
/// <param name="args"></param>
public void Invoke(string eventName, object[] args = null)
{
if (EventDic.ContainsKey(eventName)) EventDic[eventName].Invoke(args);
}
}
用例 :
public class EventTest : MonoBehaviour
{
public Text txtCoinsShow;
void Start()
{
// -----------货币显示更新
// 注册
EventCenter.Instance.Register(EventDefine.CoinUpdate, OnCoinUpdate);
// -----------买飞机
// 注册
EventCenter.Instance.Register(EventDefine.BuyPlane, OnBuyPlane);
// 调用
EventCenter.Instance.Invoke(EventDefine.BuyPlane, new object[] { 998, "中型" });
}
private void OnCoinUpdate(object[] obj = null)
{
txtCoinsShow.text = PlayerService.Instance.Coins.ToString();
}
private void OnBuyPlane(object[] obj)
{
Debug.Log(string.Format("飞机价格{0}型号{1}", obj[0], obj[1]));
}
private void OnDestroy()
{
// 删除
EventCenter.Instance.Remove(EventDefine.CoinUpdate, OnCoinUpdate);
EventCenter.Instance.Remove(EventDefine.BuyPlane, OnBuyPlane);
}
}
public class PlayerService : Singleton<PlayerService>
{
private int coins;
public int Coins
{
get { return coins; }
set {
// (像更新货币之类的UI显示,在货币属性Set中调用)
coins = value;
EventCenter.Instance.Invoke(EventDefine.CoinUpdate);
}
}
}
public static class EventDefine
{
public static string CoinUpdate = "CoinUpdate";
public static string BuyPlane = "BuyPlane";
}