目录
C#Messenger是UntiyCommunity里的一个工具类,其效果是可以实现一个消息系统,其实现的具体效果表现为:
两个脚本之间发送消息可以不需要相互引用,保证解耦,内部是委托,可以实现单播和多播
Messenger下载链接:files.cnblogs.com/files/FlyingZiming/Messenger.zip
一个只读委托表
添加监听者的内部函数
检查表里是不是有这个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
foreach (var callback in invocationList)
callback.Invoke(arg1);
}
一条公有的Message,可以在一个静态类里管理
发送方
接收方
void OnEnable()
{
Messenger.AddListener(Message.TouchCat, CatBeTouched2);
}
void OnDisable()
{
Messenger.RemoveListener(Message.TouchCat, CatBeTouched2);
}
void CatBeTouched()
{
Debug.Log("喵喵喵"+gameObject.name);
}</code></pre></li></ul>
同一条Message可以对应不同对象上的不同脚本的不同方法,必须都是没有参数的
公有的Message
发送方
Messenger
Messenger里的泛型要保持和方法的参数一致
接收方(三个参数最多,想要四个参数尝试扩展模板看看)待确定
void OnEnable()
{
Messenger
}
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);
}</code></pre></li></ul>
一条消息只能对应一种函数类型,返回值参数要相同
公有的Message
发送方
Messenger.Broadcast
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;
}</code></pre></li>
返回值作为回调函数的参数
Func的委托
上面两者的结合
转载请标明出处,作者:FlyingZiming 博客:https://www.cnblogs.com/FlyingZiming/p/12521257.html
手机扫一扫
移动阅读更方便
你可能感兴趣的文章