C#Messenger分析和使用方法
C#Messenger是UntiyCommunity里的一个工具类,其效果是可以实现一个消息系统,其实现的具体效果表现为:
两个脚本之间发送消息可以不需要相互引用,保证解耦,内部是委托,可以实现单播和多播
Messenger下载链接:files.cnblogs.com/files/FlyingZiming/Messenger.zip
源码分析
一个只读委托表
readonly public static Dictionary<string, Delegate> eventTable = new Dictionary<string, Delegate>();
添加监听者的内部函数
检查表里是不是有这个string了,有就然后检查这个delegate的签名是不是和表里的一致的,没有则添加
static public void AddListener(string eventType, Delegate callback)
{
MessengerInternal.OnListenerAdding(eventType, callback);
eventTable[eventType] = Delegate.Combine(eventTable[eventType], callback);
}
要记得RemoveListener
广播函数
触发该string对应的一个委托
播送者可以设置回调函数,以Listener的返回值为参数,所以只能有一个参数
根据广播传的参数数量不同,有几种broadcast模板,这里取传一个参数的broadcast作为例子
static public void Broadcast(string eventType, T arg1, MessengerMode mode)
{
MessengerInternal.OnBroadcasting(eventType, mode);
var invocationList = MessengerInternal.GetInvocationList<Action<T>>(eventType); foreach (var callback in invocationList)
callback.Invoke(arg1);
}
使用方法
没有返回值没有传参的消息写法
一条公有的Message,可以在一个静态类里管理
发送方
Messenger.Broadcast(Message.TouchCat);
接收方
void OnEnable()
{
Messenger.AddListener(Message.TouchCat, CatBeTouched2);
} void OnDisable()
{
Messenger.RemoveListener(Message.TouchCat, CatBeTouched2);
} void CatBeTouched()
{
Debug.Log("喵喵喵"+gameObject.name);
}
同一条Message可以对应不同对象上的不同脚本的不同方法,必须都是没有参数的
- Action无参数的委托
没有返回值有参数的消息写法
公有的Message
发送方
Messenger<int,float,int>.Broadcast(Message.TouchCat,100,20f,3);
Messenger里的泛型要保持和方法的参数一致
接收方(三个参数最多,想要四个参数尝试扩展模板看看)待确定
void OnEnable()
{
Messenger<int,float,int>.AddListener(Message.TouchCat, CatBeTouchedWithForce);
} void OnDisable()
{
Messenger<int,float,int>.RemoveListener(Message.TouchCat, CatBeTouchedWithForce);
} void CatBeTouchedWithForce(int Force,float time,int n)
{
Debug.Log("Touch Force:"+Force+",时间:"+time+"s"+n);
}
一条消息只能对应一种函数类型,返回值参数要相同
- Action有参数的委托
有返回值的消息写法
公有的Message
发送方
Messenger.Broadcast<int>(Message.TouchCat,CatTouchedCallBack); void CatTouchedCallBack(int a)
{
Debug.Log("乖!" + a);
}
回调函数只有一个 泛型名字为TReturn
接收方
void OnEnable()
{
Messenger.AddListener(Message.TouchCat, CatBeTouchedWithReturn);
} void OnDisable()
{
Messenger.RemoveListener(Message.TouchCat, CatBeTouchedWithReturn); } int CatBeTouchedWithReturn()
{
Debug.Log("cat return");
return 10;
}
返回值作为回调函数的参数
Func的委托
有参数有返回值的委托
上面两者的结合
Messenger<int, float, int>.Broadcast<int>(Message.TouchCat,1,20f,3, CatTouchedCallBack);
转载请标明出处,作者:FlyingZiming 博客:https://www.cnblogs.com/FlyingZiming/p/12521257.html
C#Messenger分析和使用方法的更多相关文章
- CPU利用率异常的分析思路和方法交流探讨
CPU利用率异常的分析思路和方法交流探讨在生产运行当中,经常会遇到CPU利用率异常或者不符合预期的情况,此时,往往暗示着系统性能问题.那么究竟是核心应用的问题?是监控工具的问题?还是系统.硬件.网络层 ...
- PHP抓取及分析网页的方法详解
本文实例讲述了PHP抓取及分析网页的方法.分享给大家供大家参考,具体如下: 抓取和分析一个文件是非常简单的事.这个教程将通过一个例子带领你一步一步地去实现它.让我们开始吧! 首先,我首必须决定我们将抓 ...
- SQL Server2005索引碎片分析和解决方法
SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根 ...
- 《奥威Power-BI智能分析报告制作方法 》精彩回顾
上次课我们简单介绍了奥威Power-BI的智能分析报告,并展示了报告与图表相结合的应用场景.图文分析报表的意义不只在于美观,更重要的是固定框架下的灵活性和追根究底的动态分析,有着很强的实用性.上节课 ...
- 12月07日《奥威Power-BI智能分析报告制作方法 》腾讯课堂开课啦
前几天跟我一个做报表的哥们聊天,听着他一茬一茬地诉苦:“每天做报表做到想吐,老板看报表时还是不给一个好脸色.”我也只能搬出那一套“过程大于结果”的内心疗程赠与他,没想到他反而怒了:“做 ...
- 《奥威Power-BI智能分析报表制作方法》精彩回顾
年的最后一个月,一年又快过去.工作和学习都不能耽误,本周三奥威公开课又如约与大家见面咯!不知老师教的图文报表在课后你们都有练习吗?趁热打铁,我们现在再次来温习一下吧. 本期分享的内容:<奥威Po ...
- 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦
这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ...
- ajax对一些没有接口的数据进行分析和添加方法
对于一些没有接口的数据进行分析和添加方法: <script src="ajax.js"><script>//插入ajax文件 <script> ...
- Nginx 504 Gateway Time-out分析及解决方法
一.场景还原php程序在执行抓取远程图片库并保存至本地服务器的时候,出现了“504 Gateway Time-out”错误提示. 问题定位:由于图片巨多,所以下载时间很长(10分钟以上),引起网关超时 ...
随机推荐
- 兄弟,你爬虫基础这么好,需要研究js逆向了,一起吧(有完整JS代码)
这几天的确有空了,看更新多快,专门研究了一下几个网站登录中密码加密方法,比起滑块验证码来说都相对简单,适合新手js逆向入门,大家可以自己试一下,试不出来了再参考我的js代码.篇幅有限,完整的js代码在 ...
- 从《三体》到“中美科技战”,3分钟理解“网络”D丝为什么要迎娶“算力”白富美
摘要:在多维的世界里,高维的文明对于低维文明具有碾压的优势,而网络也正在从二维走向三维!网络硬件的竞争主要是“芯片+算法”. 从三体到中美科技战,理解网络与算力深度融合助力高维度竞争 1:对抗封锁,需 ...
- 区块链入门到实战(12)之区块链 – 默克尔树(Merkle Tree)
目的:解决由于区块链过长,导致节点硬盘存不下的问题. 方法:只需保留交易的哈希值. 区块链作为分布式账本,原则上网络中的每个节点都应包含整个区块链中全部区块,随着区块链越来越长,节点的硬盘有可能放不下 ...
- WPF新手快速入门系列 2.绑定
[概要] 上一章讲了布局,按照市面上的书籍每一本讲的顺序都不一样,本系列是希望大家能快速上手去应对工作需要,所以本章就直接开始讲绑定. 如有学习过程中想交流学习.疑惑解答可以来此QQ群交流:58074 ...
- 力扣Leetcode 45. 跳跃游戏 II - 贪心思想
这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...
- python习题 随机密码生成 + 连续质数计算
随机密码生成 描述 补充编程模板中代码,完成如下功能: ...
- Apache 顶级项目 Apache Pulsar 成长回顾
关于 Apache Pulsar Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息.存储.轻量化函数式计算为一体,采用计算与存储分离架构设计,支 ...
- 遇到doxygen生成的chm文档目录如果有中文是乱码?
原因不在于doxygen,它没有问题,问题出在微软的HTML Help Workshop的hhc.exe不支持utf8.所以要解决这个问题,需要做两个额外的步骤: 1.将html/index.hhp中 ...
- Spring MVC实例创建(一)
Spring MVC Spring MVC 为展现底层提供的基于MVC设计理念的优秀的Web框架,是目前最流行的MVC框架之一.Spring3.0后全面超越Struts2,成为最为优秀的MVC框架.S ...
- 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...