zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    7maven依赖排除
    5maven生命周期
    4maven依赖范围、依赖有效性
    3maven常用命令和配置依赖
    1maven概念作用
    6在Eclipse中创建maven和修改默认配置
    2maven下载与配置
    Class 'org.apache.tomcat.jdbc.pool.DataSource' not found
    17 alternatives to your default image viewer on Fedora
    zip压缩包解压后的文件名是乱码?
  • 原文地址:https://www.cnblogs.com/FlyingZiming/p/12545782.html
Copyright © 2011-2022 走看看