using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum CEventType
{
one,
two,
three,
four
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CBaseEvent
{
private CEventType type;
private Hashtable arguments;
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 CBaseEvent(CEventType type)
{
this.Type = type;
if (this.arguments == null)
{
this.arguments = new Hashtable();
}
}
public CBaseEvent(CEventType type, Hashtable args)
{
this.Type = type;
this.arguments = args;
if (this.arguments == null)
{
this.arguments = new Hashtable();
}
}
public CBaseEvent(CEventType type, params object[] args)
{
this.Type = type;
if (this.arguments == null)
{
this.arguments = new Hashtable();
}
for (int i = 0; i < args.Length; i++)
{
this.arguments.Add(i, args[i]);
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate void CEventListenerDel(CBaseEvent evt);
public class CEventDispatcher : Singleton<CEventDispatcher>
{
private Hashtable listeners = new Hashtable();
public void AddListener(CEventType type, CEventListenerDel listener)
{
CEventListenerDel CDel = this.listeners[type] as CEventListenerDel;
CDel += listener;
this.listeners[type] = CDel;
}
public void RemoveListener(CEventType type, CEventListenerDel listener)
{
CEventListenerDel CDel = this.listeners[type] as CEventListenerDel;
if (CDel != null)
CDel -= listener;
this.listeners[type] = CDel;
}
public void RemoveAll()
{
this.listeners.Clear();
}
public void DispatchEvent(CBaseEvent evt)
{
CEventListenerDel CDel = this.listeners[evt.Type] as CEventListenerDel;
if (CDel != null)
{
try
{
CDel(evt);
}
catch (Exception ex)
{
throw new Exception(string.Concat(new string[]
{
"Error dispatching event",
evt.Type.ToString(),
": ",
ex.Message,
" ",
ex.StackTrace
}), ex);
}
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MB_Singleton<Test>
{
// Use this for initialization
void Start()
{
CEventDispatcher.Get().AddListener(CEventType.one, Hello);
}
// Update is called once per frame
void Update()
{
}
void OnGUI()
{
if (GUI.Button(new Rect(100, 100, 100, 100), "有参事件"))
{
CEventDispatcher.Get().DispatchEvent(new CBaseEvent(CEventType.one, "nihao", 123, "啊啊"));
}
}
public void Hello(CBaseEvent evt)
{
for (int i = 0; i < evt.Params.Count; i++)
{
print(evt.Params[i]);
}
}
}
Test 为方法的调用, CEventDispatcher是对事件的注册和分发,继承了普通单例模式.