Unity(三)C#委托中的事件Event

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LinZhonglong/article/details/78351842

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; 
  }
}

匿名委托的使用:

实现排序功能

猜你喜欢

转载自blog.csdn.net/LinZhonglong/article/details/78351842