PS:以前看Delegate还迷迷糊糊,今天刚好在一个插件中看到Event,很好用.例如当完成某个事情时告诉其他人做完了
感谢这位作者朋友,简单易懂实用http://www.cnblogs.com/promise-7/archive/2012/05/14/2500759.html
方式一:
代码模块:
//事件中心
Class EventCenter
{
声明方式1:
//声明委托,可带参
public delegate void EventDelegate(string s1);
//声明事件
public static event EventDelegate eventHandler;
声明方式2:
//带返回值泛型统称,参数可以是任意类型
public delegate void EventDelegateA<T>(T t);
public delegate void EventDelegateB<T1,T2>(T1 t1,T2 t2);
例如
public static event EventDelegateA<bool> eventHandlerA;
public static event EventDelegateB<int,bool> eventHandlerB;
//只需声明一个泛型委托,事件可以添加该泛型委托的多个
//调用事件中心发送消息
Public static void SendMessage()
{
If(eventHandler!=null)
eventHandler("我已完成某任务!");
}
if(eventHandlerA!=null)
eventHandlerA(true);
}
Class Sender
{
public void Update()
{
if(input.getkeydown(keycode.space))
EventSender.SendMessage();
}
}
//接收者
Class Listener:MonoBehavior
{
//预先注册事件并绑定方法
void Awake()
{
//订阅该事件,例如订阅报纸,有新内容都会通知所有订阅者
EventCenter.eventHandler+=RecieveMessage;
}
//如果委托带参,此方法也应同参
void RecieveMessage(string sr)
{
Print("收到消息:"+sr);
//该我Do something了
}
void OnDestroy()
{
//移除注册过的委托
EventCenter.eventHandler-=RecieveMessage;
}
.
方式二: 来自AudioObject插件
可以注意到,如果想得到事件的回调,前提是必须先注册并委托给X函数。那么,如果完成XXX后调用委托则若有B /C/D等人的话都会收到消息。
但是我只想当前的函数得到消息就可。于是,我们需要使用的时候再来指定X函数
X类 (某声音对象播放完后委托给X函数,得到对象的ID)
在AudioObject类看一下
委托与事件实现了设计模式中的观察者模式,即一个为订阅者,一个为发送者。当消息发送时,凡是注册/订阅的用户都能收到
综上,一个简单好用的事件委托就实现了。希望能帮到大家,谢谢!
方式三:此处Action委托可结合我的文章里的回调函数一起参考
从以上不难看出,一共可分为三步
一:添加AddListener 移除RemoveListener
二:订阅事件(需声明委托)
三:调用
通俗点来说就是,当需要的时候把一个函数注册绑定给一个委托,Action也好,Func也罢(取决于需不需要返回值)。当我们再次调用这个action 或者event发出消息后,这个注册过的函数开始执行,也实现了回调
示例代码:
//某类
class MyClass:MonoBehavior
{
public Listener mListener;//需要赋值
void Start()
{
//可在需要的函数内注册
AddListener(MyFunction);
}
void OnDestroy()
{
RemoveListener(MyFunction);
}
private void AddListener(Action<eEvent,int> listener)
{
if(mListener)
{
mListener.AddListener(listener);
}
}
private void RemoveListener(Action<eEvent,int> listener)
{
if(mListener)
{
mListener.RemoveListener(listener);
}
}
//需要委托的函数。注:Action代表无返回值委托<T1,T2,T3>皆为参数
private void MyFuction(eEvent event,int index)
{
//要处理的逻辑...
}
}
//订阅者
class Listener:MonoBehavior
{
//参数可根据需要T1,T2,T3自行决定
private Action<eEvent,int> mAction
public enum eEvent
{
eventA,
eventB
}
//调用委托后,MyClass里的MyFunction函数开始处理逻辑,因为已注册过
public void NotifyEvent(eEvent e,int index)
{
if(mAction!=null)
{
mAction.Invoke(e,index);
}
}
//订阅事件
public void AddListener(Action<eEvent,int> listener)
{
mAction+=listener;
}
//移除事件
public void RemoveListener(Action<eEvent,int> listener)
{
mAction-=listener;
}
}
匿名委托的使用:
实现排序功能