原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0511/491.html
前言
App开发培训游戏开发中抛事情,收事情也是比拟常用的解耦方式,我所了解的设计形式旁观者形式有相似的原理,所以事情系统在一个框架中还是蛮重要的一块,本惹事件系统不算一个大系统,代码量不多,主要是思绪就是注册监听。
代码
EventManager
using GF.Debug;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace GF.EventSystem
{
/// <summary>
/// 音讯分发器
/// </summary>
public class EventManager
{
private static EventManager instance;
public static EventManager Instance
{
get
{
if (null == instance)
instance = new EventManager();
return instance;
}
set
{
instance = value;
}
}
/// <summary>
/// 拜托事情
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sender"></param>
/// <param name="evt"></param>
public delegate void EventHandler<T>(object sender, T evt);
/// <summary>
/// 注册事情字典
/// </summary>
public Dictionary<Type, List<object>> handlers = new Dictionary<Type, List<object>>();
/// <summary>
/// 注册事情
/// </summary>
/// <typeparam name="T">Class类型</typeparam>
/// <param name="handler">函数</param>
public void Register<T>(EventHandler<T> handler)
{
Debugger.Log("注册事情:" + handler.Method.Name);
Register(typeof(T), handler);
}
private void Register<T>(Type EventType, EventHandler<T> handler)
{
if (!handlers.ContainsKey(EventType))
{
handlers.Add(EventType, new List<object>());
}
if (!handlers[EventType].Contains(handler))
{
handlers[EventType].Add(handler);
}
}
/// <summary>
/// 分发事情
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sender"></param>
/// <param name="evt"></param>
public void Publish<T>(object sender, T evt)
{
subscribe(null, typeof(T), evt);
}
/// <summary>
/// 发送通知事情
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sender"></param>
/// <param name="EventType"></param>
/// <param name="evt"></param>
private void publish<T>(object sender, Type EventType, T evt)
{
if (handlers.ContainsKey(EventType))
{
Debugger.Log("public event key:" + typeof(T));
//移除一切的无效事情
handlers[EventType].RemoveAll(delegate (object handler) { return handler == null; });
for (int i = 0; i < handlers[EventType].Count; i++)
{
object handler = handlers[EventType][i];
MethodInfo method = handler.GetType().GetMethod("Invoke");
method.Invoke(handler, new object[] { sender, evt });
}
}
else
{
Debugger.Log(string.Format("<color=red>未注册的Key:{0}</color>", EventType));
}
}
/// <summary>
/// 注销事情
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="handler">注册函数名</param>
public void UnRegister<T>(EventHandler<T> handler)
{
UnRegister(typeof(T), handler);
}
private void UnRegister<T>(Type EventType, EventHandler<T> handler)
{
if (handlers.ContainsKey(EventType))
{
handlers[EventType].Remove(handler);
Debugger.Log("Remove Event:" + handler);
if (0 == handlers[EventType].Count)//注册常州网站开发培训事情为空时,移除字典Key
{
handlers.Remove(EventType);
}
}
}
/// <summary>
/// 清空注册事情
/// </summary>
public void Clear()
{
handlers.Clear();
}
}
}
运用
监听音讯
EventManager.Instance.Register<FishRoundData>(onFrameData);
取消监听
EventManager.Instance.UnRegister<FishRoundData>(onFrameData);
监听音讯回调
private void onFrameData(object sender, FishRoundData data)
{
}
分发音讯
EventManager.Instance.Publish<FishRoundData>(this, roundData.Value);
改良
我们能够将要监听的事情构造笼统一下,然后每新增一个音讯就直接继承这个基类,这样我们监听音讯回调就是一个统一的办法,然后强转data变成自定义的事情构造。
事情基类 GFEventArgs
/// <summary>
/// 游戏框架中包含事情数据的类的基类。
/// </summary>
public abstract class GFEventArgs : EventArgs
{
/// <summary>
/// 初始化游戏框架中包含事情数据的类的新实例。
/// </summary>
public GFEventArgs()
{
}
}
游戏事情基类
/// <summary>
/// 游戏逻辑事情基类。
/// </summary>
public abstract class GameEventArgs : GFEventArgs
{
}
EventManager
internal sealed class EventManager1
{
private readonly List<GameEventArgs> m_EventPool;
public EventManager1()
{
m_EventPool = new List<GameEventArgs>();
}
public bool Check(int id, EventHandler<GameEventArgs> handler)
{
//检查事情
}
public void Subscribe(int id, EventHandler<GameEventArgs> handler)
{
//订阅音讯
}
public void Unsubscribe(int id, EventHandler<GameEventArgs> handler)
{
//取消订阅企业培训
}
public void Fire(object sender, GameEventArgs e)
{
//放入事情响应队列
}
public void FireNow(object sender, GameEventArgs e)
{
//立即响应
}
}
运用
Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
{
OpenUIFormSuccessEventArgs ne = (OpenUIFormSuccessEventArgs)e;
// 判别userData能否为本人
if (ne.UserData != this)
{
return;
}
Log.Debug("UI_Menu:祝贺你,胜利地召唤了我。");
}
上篇:上一篇:Unity+IOS GPS后台更新GPS数据
下篇:下一篇:particle-editor用法