【UnityC#】写了一个事件分发器
我一直都有一个需求,就是可以很方便的将Socket传进来的二进制解析到具体的某个消息,每个消息都有自己的事件处理。之前有写过一个这样的,但是事件处理必须写在各个消息类里面,这样不是很好。现在借着C#的泛型协变的这个特性,做了一个强类型的事件分发器。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FirBase
{class CDispatcherHelper{public static string GetKey<T>(){Type t = typeof(T);return t.Name;}}public interface ICallback<out T>{T GetData(byte[] data);void Exce(byte[] data);}public class CallBack<T> : ICallback<T>{private Action<T> _handle = null;public CallBack(Action<T> handle){_handle = handle;}public void Exce(byte[] data){var tData = GetData(data);exce(tData);}public T GetData(byte[] data){return SerializationHelper.BinaryDeSerialization<T>(data);}public void exce(T data){if (_handle != null){_handle(data);} }}public class Dispatcher{private Dictionary<string, ICallback<Object>> _callBackDic = new Dictionary<string, ICallback<Object>>();private ICallback<Object> _curCallBack = null;/// <summary>/// 注册消息/// </summary>/// <typeparam name="T"></typeparam>/// <param name="callback"></param>/// <returns></returns>public bool Reg<T>(ICallback<T> callback){_callBackDic[CDispatcherHelper.GetKey<T>()] = (ICallback<Object>)callback;return false;}/// <summary>/// 分发消息/// </summary>/// <param name="key"></param>/// <param name="data"></param>public void MsgDispatcher(string key, byte[] data){if (_callBackDic.TryGetValue(key, out _curCallBack)){_curCallBack.Exce(data);}}}
}
没有做多线程的处理
现在是例子,首先我们定义一个TestMsg,这个类必须是可序列化的。
[Serializable]class TestMsg{public string aa;public string bb;}
然后我们要注册消息,并且设置消息的回调函数
class MsgHandle{public MsgHandle(FirBase.Dispatcher dispatcher){dispatcher.Reg(new FirBase.CallBack<TestMsg>(OnTestMsg));}public void OnTestMsg(TestMsg msg){FirBase.FirLog.v(this, "aa=" + msg.aa + "bb=" + msg.bb);}}
然后在main函数中这样调用
Dispatcher testDispatcher = new Dispatcher();MsgHandle handle = new MsgHandle(testDispatcher);
接下来,我们6秒后发送消息,这就需要用到之前造的轮子协程了。
发送消息的函数大概这样的:
private static IEnumerator delaySendMsg(Dispatcher dispatcher){yield return new FirBase.WaitForSecond(new TimeSpan(0, 0, 6));TestMsg msg = new TestMsg();msg.aa = "haha";msg.bb = "heihei";dispatcher.MsgDispatcher(DispatcherHelper.GetKey<TestMsg>(), SerializationHelper.BinarySerialization(msg));}
然后协程的调用是这样的:
FirTask.Instance.AddTask(delaySendMsg(testDispatcher));while(true){FirTask.Instance.DoTask();}
运行结果如下:
最后的最后,忘了说序列化那块了,调用的是C#自带的序列化函数,只是稍微包装了一下:
public class SerializationHelper{/// <summary>/// 二进制序列化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="data"></param>/// <returns></returns>public static byte[] BinarySerialization<T>(T data){byte[] bData = null;BinaryFormatter formatter = new BinaryFormatter();using (MemoryStream stream = new MemoryStream()){formatter.Serialize(stream, data);bData = stream.GetBuffer();}return bData;}/// <summary>/// 二进制反序列化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="data"></param>/// <returns></returns>public static T BinaryDeSerialization<T>(byte[] data){T t;BinaryFormatter formatter = new BinaryFormatter();using (MemoryStream stream = new MemoryStream(data)){t = (T)formatter.Deserialize(stream);}return t;}}
demo在这里,这篇博客一最后
http://blog.csdn.net/nxshow/article/details/51067764
【UnityC#】写了一个事件分发器相关推荐
- cocos2d JS 自定义事件分发器(接收与传递数据) eventManager
简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({event: cc.EventListener ...
- 师兄写的一个JAVA播放器的源代码(转)
师兄写的一个JAVA播放器的源代码 MediaPlayer.java ----------------------------------------------------------------- ...
- 关于对 Unity 3D Strange IoC 框架事件分发器的认识
------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 关于事件分发器的认识 publi ...
- 【UE】事件分发器 正确使用方法 (如何创建 Bnd Evt Delegate Signature)
事件分发器(Event Dispatch) 1. 创建Event Dispatch 打开蓝图类,左下角新建EventDispatch: 然后命名一下这个分发器.这里以UE5为例,UE4同理的. 命名为 ...
- UE4虚幻引擎关于事件分发器的使用!
UE4虚幻引擎关于事件分发器的使用! 首先,这次就讲一下,事件分发器,在UI,Pawn,子actor如何进行事件传递! 首先!我们如果要使用事件分发器的原因是什么! 第一,肯定是方便,快! 第二,为了 ...
- (十三)事件分发器——event()函数,事件过滤
事件分发器--event()函数 事件过滤 事件进入窗口之前被拦截 eventFilter #include "mywidget.h" #include "ui_mywi ...
- Unity事件分发器
事件分发机制也被称之为事件监听派发系统,在每个游戏框架中都是不可或缺的一个模块.起作用主要是用来解耦,监听网络消息,或者做一些异步的操作等,下面是使用C#在Unity游戏开发中的事件分发处理机制的简单 ...
- java mplayer 源码_师兄写的一个JAVA播放器的源代码
MediaPlayer.java ---------------------------------------------------------------------------- //程序主文 ...
- QT + OpenGL + FFmpeg写的一个全景视频播放器
临时被分配了一个任务 写一个C++版本的全景视频播放器 网上搜了搜 基于前辈的基础上 写的差不多了 测试视频源是用ffmpeg拉RTSP的流 最终是要嵌入到别的一个视频播放器模块 所以解码这块我不用 ...
最新文章
- 使用jquery 根据下拉列表的name值查找被选中的值
- Spring与Hibernate两种组合方式
- Jenkins deploy to container部署war到tomcat(学习笔记十六)
- MSSQL-SQL SERVER 分页原理
- 多任务 schedule python_Python3.6 Schedule 模块定时任务 (实例讲解)
- 【Elasticsearch】为Elasticsearch启动https访问
- 干货分享,我是怎么寻找暴利赚钱项目的
- mysql模糊查询 or_mysql 模糊查询 - yizhichao的个人页面 - OSCHINA - 中文开源技术交流社区...
- 给员工授予svn相关权限
- linux停止tomcat为什么要kill其掉进程 而不是直接shutdown.sh
- Ubuntu下安装stlink-v2驱动
- 人工智能无线通信应用的一些论文
- dwcs6中php为什么浏览不了,dreamweaver CS6编辑浏览器列表无法添加浏览器的解决处理...
- 【数据库】imp-00015
- 用python处理excel文件_python处理Excel文件
- CAD建筑制图入门加老虎窗
- mysql 留存率_mysql查询用户留存语法(用户留存和用户留存率问题)
- 蔡先生论道大数据之一 : 大数据由来
- 地图导航开启蓝牙后无导航语音
- 电阻网络法DAC分析
热门文章
- 国防科大计算机学院吕品,国防科技大学徐明教授访问重点实验室
- nexus5 android7 root,nexus 5/5x/6/6p/7/9 安卓8/7/6.0.1一键root办法
- Linux:使用ulimit设置文件最大打开数
- linux 拍照的软件,六款优秀的Linux照片管理软件
- 一个人不成熟,有三大表现
- Android系统的图标设计规范
- 晨曦记账本记账,使用项目查看账目
- SaaS模式在国内的基本现状研究
- AN/APG-68雷达空对空雷达模式
- js textarea换行