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分析和使用方法的更多相关文章

  1. CPU利用率异常的分析思路和方法交流探讨

    CPU利用率异常的分析思路和方法交流探讨在生产运行当中,经常会遇到CPU利用率异常或者不符合预期的情况,此时,往往暗示着系统性能问题.那么究竟是核心应用的问题?是监控工具的问题?还是系统.硬件.网络层 ...

  2. PHP抓取及分析网页的方法详解

    本文实例讲述了PHP抓取及分析网页的方法.分享给大家供大家参考,具体如下: 抓取和分析一个文件是非常简单的事.这个教程将通过一个例子带领你一步一步地去实现它.让我们开始吧! 首先,我首必须决定我们将抓 ...

  3. SQL Server2005索引碎片分析和解决方法

    SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根 ...

  4. 《奥威Power-BI智能分析报告制作方法 》精彩回顾

     上次课我们简单介绍了奥威Power-BI的智能分析报告,并展示了报告与图表相结合的应用场景.图文分析报表的意义不只在于美观,更重要的是固定框架下的灵活性和追根究底的动态分析,有着很强的实用性.上节课 ...

  5. 12月07日《奥威Power-BI智能分析报告制作方法 》腾讯课堂开课啦

            前几天跟我一个做报表的哥们聊天,听着他一茬一茬地诉苦:“每天做报表做到想吐,老板看报表时还是不给一个好脸色.”我也只能搬出那一套“过程大于结果”的内心疗程赠与他,没想到他反而怒了:“做 ...

  6. 《奥威Power-BI智能分析报表制作方法》精彩回顾

    年的最后一个月,一年又快过去.工作和学习都不能耽误,本周三奥威公开课又如约与大家见面咯!不知老师教的图文报表在课后你们都有练习吗?趁热打铁,我们现在再次来温习一下吧. 本期分享的内容:<奥威Po ...

  7. 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦

    这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ...

  8. ajax对一些没有接口的数据进行分析和添加方法

    对于一些没有接口的数据进行分析和添加方法: <script src="ajax.js"><script>//插入ajax文件 <script> ...

  9. Nginx 504 Gateway Time-out分析及解决方法

    一.场景还原php程序在执行抓取远程图片库并保存至本地服务器的时候,出现了“504 Gateway Time-out”错误提示. 问题定位:由于图片巨多,所以下载时间很长(10分钟以上),引起网关超时 ...

随机推荐

  1. 小白式DPDK搭建方法(附相关错误得处理方法)

    搭建环境:VM VM搭建参考其他博客 步骤一 点击虚拟机设置,添加两个网卡(我这里都是使用的都是桥接模式) 步骤二.从网上下载dpdk的压缩包: 命令:wget http://fast.dpdk.or ...

  2. better-scroll实现滚动

    通过better-scroll这个插件实现微信好友滚动列表 安装better-scroll npm i better-scroll 初始化better-scroll   //better-scroll ...

  3. [SCOI2013]摩托车交易 题解

    思路分析 为了让交易额尽量大,显然我们需要尽量多地买入.对于每个城市,到达这个城市时携带的黄金受到几个条件的影响:之前卖出的黄金,之前能买入的最多的黄金,前一个城市到当前城市的路径上的最小边权.既然不 ...

  4. C++算法 线段树

    线段树这个算法,看起来非常高端,而且很有用处,所以还是讲一下下吧. 温馨提示:写线段树前请做好写码5分钟,调试一辈子的准备^-^ 啊直接步入正题…… 首先我们考虑一个题目:有一个序列,要做到单点修改单 ...

  5. vue再学习

    day01 Vue 是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架 vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合 使用Vu ...

  6. openCV - 4. 图像操作

    读写图像.读写像素.修改像素值 读写图像 imread 可以指定加载为灰度或者RGB图像 Imwrite 保存图像文件,类型由扩展名决定 读写像素 读一个GRAY像素点的像素值(CV_8UC1) Sc ...

  7. python编写汉诺塔 Hanoi

    #hanoi.py count = 0 def hanoi(n, src, dst, mid): #src为原1号柱子 dst 目标3号柱子 mid中间2号过渡柱子 global count #对全局 ...

  8. C# 解析获取Url参数值

    今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的Url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串.样例如下: http://www.cple ...

  9. webdriver入门之环境准备

    1.安装ruby 下载ruby的安装包,很简单,不解释.装好之后打开cmd输入以下命令验证是否安装成功 ruby -v 2.安装webdriver 确保机器联网,用gem命令安装是在有网络的情况下进行 ...

  10. 利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

    一.反转整个链表 问题:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5-&g ...