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

最新文章

  1. CSS3鼠标悬停图片上浮显示描述代码
  2. Hbase0.96 MVCC Lock 知识梳理
  3. Wait Type:IO_COMPLETION
  4. AE 栅格数据使用总结
  5. Apache与Nginx的比较
  6. SQL每个月份的发生额都比101科目多的科目
  7. XMemcached简单使用示例
  8. ORA-00119/ORA-00132
  9. poj3185 高斯消元
  10. Centos下安装Python的问题汇总
  11. 关于xpath相对路径前加点与不加点的区别
  12. BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法
  13. java的toString()及包装类的实现--Integer重点学习
  14. Virtual Hosts
  15. BZOJ4613 : [Wf2016]Longest Rivers
  16. ubuntu apache ssl配置
  17. 如何提高php应用的性能?
  18. 阿里云linux图形界面(centos6)
  19. Matlab基本用法
  20. cocos2d-x-lua如何导出自定义类到lua脚本环境

热门文章

  1. asyncio异步模块的21个协程编写实例
  2. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(五):创建使用[Code-授权码]授权模式的客户端
  3. 前端系列-CS与BS的区别
  4. 获取访问的ip地址
  5. 使用 Postman 做 API 自动化测试
  6. wmz的数数(数状数组)
  7. .NET Core 中导入导出Excel
  8. DSRC和USRP的购买调研
  9. leetcode刷题-69x的平方根
  10. i春秋公益赛之BFnote