转自:http://www.manew.com/blog-117699-43032.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum CEventType
{
GAME_OVER,
GAME_WIN,
PAUSE,
GAME_DATA,
}
public class CBaseEvent
{
protected Hashtable arguments;
protected CEventType type;
protected object sender;
protected string eventName;
public CEventType Type
{
get
{
return this.type;
}
set
{
this.type = value;
}
}
public IDictionary Params
{
get
{
return this.arguments;
}
set
{
this.arguments = (value as Hashtable);
}
}
public object Sender
{
get
{
return this.sender;
}
set
{
this.sender = value;
}
}
public string EventName
{
get
{
return eventName;
}
set
{
eventName = value;
}
}
public override string ToString()
{
return this.type + " { " + ((this.sender == null) ? "null" : this.sender.ToString()) + " } ";
}
public CBaseEvent Clone()
{
return new CBaseEvent(this.type, this.arguments, Sender);
}
public CBaseEvent(CEventType type, object sender)
{
this.Type = type;
Sender = sender;
if (this.arguments == null)
{
this.arguments = new Hashtable();
}
}
public CBaseEvent(CEventType type, Hashtable args, object sender)
{
this.Type = type;
this.arguments = args;
Sender = sender;
if (this.arguments == null)
{
this.arguments = new Hashtable();
}
}
public CBaseEvent(string eventName, object sender)
{
this.EventName = eventName;
Sender = sender;
if (this.arguments == null)
{
this.arguments = new Hashtable();
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate void CEventListenerDelegate(CBaseEvent evt);
public class CEventDispatcher
{
static CEventDispatcher instance;
public static CEventDispatcher GetInstance()
{
if (instance == null)
{
instance = new CEventDispatcher();
}
return instance;
}
private Hashtable listeners = new Hashtable();
public void AddEventListener(CEventType eventType, CEventListenerDelegate listener)
{
CEventListenerDelegate ceventListenerDelegate = this.listeners[eventType] as CEventListenerDelegate;
ceventListenerDelegate = (CEventListenerDelegate)Delegate.Combine(ceventListenerDelegate, listener);
this.listeners[eventType] = ceventListenerDelegate;
}
public void RemoveEventListener(CEventType eventType, CEventListenerDelegate listener)
{
CEventListenerDelegate ceventListenerDelegate = this.listeners[eventType] as CEventListenerDelegate;
if (ceventListenerDelegate != null)
{
ceventListenerDelegate = (CEventListenerDelegate)Delegate.Remove(ceventListenerDelegate, listener);
}
this.listeners[eventType] = ceventListenerDelegate;
}
public void AddEventListener(string eventName, CEventListenerDelegate listener)
{
CEventListenerDelegate ceventListenerDelegate = this.listeners[eventName] as CEventListenerDelegate;
//这个combine就相当于委托的+= (整体的实现就是类似于观察者模式)
ceventListenerDelegate = (CEventListenerDelegate)Delegate.Combine(ceventListenerDelegate, listener);
this.listeners[eventName] = ceventListenerDelegate;
}
public void RemoveEventListener(string eventName, CEventListenerDelegate listener)
{
CEventListenerDelegate ceventListenerDelegate = this.listeners[eventName] as CEventListenerDelegate;
if (ceventListenerDelegate != null)
{
ceventListenerDelegate = (CEventListenerDelegate)Delegate.Remove(ceventListenerDelegate, listener);
}
this.listeners[eventName] = ceventListenerDelegate;
}
public void DispatchEventOnce(CBaseEvent evt)
{
CEventListenerDelegate ceventListenerDelegate;
if (string.IsNullOrEmpty(evt.EventName))
{
ceventListenerDelegate = this.listeners[evt.Type] as CEventListenerDelegate;
}
else
{
ceventListenerDelegate = this.listeners[evt.EventName] as CEventListenerDelegate;
}
if (ceventListenerDelegate != null)
{
try
{
ceventListenerDelegate(evt);
if (string.IsNullOrEmpty(evt.EventName))
{
this.listeners.Remove(evt.Type);
}
else
{
this.listeners.Remove(evt.EventName);
}
}
catch (Exception ex)
{
throw new Exception(string.Concat(new string[]
{
"Error dispatching event ",
evt.Type.ToString(),
": ",
ex.Message,
" ",
ex.StackTrace
}), ex);
}
}
}
///
/// 使用枚举传递
///
///
public void DispatchEvent(CBaseEvent evt)
{
CEventListenerDelegate ceventListenerDelegate = this.listeners[evt.Type] as CEventListenerDelegate;
if (ceventListenerDelegate != null)
{
try
{
ceventListenerDelegate(evt);
}
catch (Exception ex)
{
throw new Exception(string.Concat(new string[]
{
"Error dispatching event ",
evt.Type.ToString(),
": ",
ex.Message,
" ",
ex.StackTrace
}), ex);
}
}
}
///
/// 使用字符串传递
///
///
public void DispatchStringEvent(CBaseEvent evt)
{
CEventListenerDelegate ceventListenerDelegate = this.listeners[evt.EventName] as CEventListenerDelegate;
if (ceventListenerDelegate != null)
{
try
{
ceventListenerDelegate(evt);
}
catch (Exception ex)
{
throw new Exception(string.Concat(new string[]
{
"Error dispatching event ",
evt.Type.ToString(),
": ",
ex.Message,
" ",
ex.StackTrace
}), ex);
}
}
}
public void RemoveAll()
{
this.listeners.Clear();
}
}
3.一共就这2个类就可以了,接下来是使用方法
using UnityEngine;
using System.Collections;
public class TestEvent : MonoBehaviour {
// Use this for initialization
void Start () {
CEventDispatcher.GetInstance().AddEventListener("开始触发", MyTestFunc);
CEventDispatcher.GetInstance().AddEventListener(CEventType.GAME_WIN, MyTestFunc);
CEventDispatcher.GetInstance().DispatchEventOnce(new CBaseEvent("开始触发","第一次"));
CEventDispatcher.GetInstance().DispatchStringEvent(new CBaseEvent("开始触发", "第三次"));
CEventDispatcher.GetInstance().DispatchEvent(new CBaseEvent(CEventType.GAME_WIN, "事件类型"));
}
void MyTestFunc(CBaseEvent evt)
{
Debug.Log("触发了该方法:"+ evt.Sender.ToString());
}
}