事件机制广泛应用于mvc模式中,灵活的事件机制能够弥补Unity中的一些缺陷,比如协程的执行。因为协程不能返回值,也不能通过out或者ref传递。通过事件机制,可以知道协程执行进度并且返回执行结果。
所有要接受事件的脚本,都要继承这个事件手柄的接口
/// <summary>
/// 事件手柄
/// </summary>
public interface IEventHandler {
void OnEvent(string type,object data);
}
以下是EventManager的主要内容,实现了注册监听,移除监听,派发事件等基本方法。只要在事件派发前,注册好就可以运行了!
using UnityEngine;
using System.Collections.Generic;
public class EventManager {
private static EventManager instance;
private Dictionary<string, List<IEventHandler>> dicHandler;
private EventManager()
{
dicHandler = new Dictionary<string, List<IEventHandler>>();
}
public static EventManager GetInstance()
{
if (instance == null)
{
instance = new EventManager();
}
return instance;
}
/// <summary>
/// 注册事件监听
/// </summary>
/// <param name="type">监听类型</param>
/// <param name="listher">监听对象</param>
public void AddEventListener(string type, IEventHandler listher)
{
if (!dicHandler.ContainsKey(type))
{
dicHandler.Add(type,new List<IEventHandler>());
}
dicHandler[type].Add(listher);
}
/// <summary>
/// 移除对type的所有监听
/// </summary>
/// <param name="type"></param>
public void RemoveEventListener(string type)
{
if (dicHandler.ContainsKey(type))
{
dicHandler.Remove(type);
}
}
/// <summary>
/// 移除监听者的所有监听
/// </summary>
/// <param name="listener">监听者</param>
public void RemoveEventListener(IEventHandler listener)
{
foreach (var item in dicHandler)
{
if (item.Value.Contains(listener))
{
item.Value.Remove(listener);
}
}
}
/// <summary>
/// 清空所有监听事件
/// </summary>
public void ClearEventListener()
{
Debug.Log("清空对所有所有所有事件的监听");
if (dicHandler!=null)
{
dicHandler.Clear();
}
}
/// <summary>
/// 派发事件
/// </summary>
/// <param name="type">事件类型</param>
/// <param name="data">事件传达的数据</param>
public void DispachEvent(string type, object data)
{
if (!dicHandler.ContainsKey(type))
{
Debug.Log("Did not add any IEventHandler of " + type + " in EventManager!");
return;
}
List<IEventHandler> list = dicHandler[type];
for (int i = 0; i < list.Count; i++)
{
list[i].OnEvent(type,data);
}
}