一.创建字典
创建脚本EventType,枚举类型,存放键值。
public enum EnventType
{
}
创建脚本EventCenter,EventType就是创建的枚举类型,表示键,后面的Delegate为值,要引入命名空间System。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class EventCenter {
//创建字典
private static Dictionary<EventType, Delegate> s = new Dictionary<EventType, Delegate>();
}
二.添加监听事件
创建脚本CallBack,存放各种重载方法
public delegate void CallBack();
public delegate void CallBack<T>(T arg);//一个参数的委托事件
在EventCenter中,定义添加监听事件的方法
//添加监听事件
private static void AddListener(EventType enventType,CallBack callBack)
{
//判断事件码是否在字典里
if (!enventDic.ContainsKey(enventType)){
enventDic.Add(enventType, null);
}
//判断传入的委托与定义的键对应的委托事件是否一致(因为有许多重载,判断参数是否一致)
Delegate delegateFromKey = enventDic[enventType];//得到定义的键对应的值
//如果值不为空,且值与传入委托事件一致
if (delegateFromKey != null && delegateFromKey.GetType() != callBack.GetType())
{
throw new Exception(String.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托是{1},需要添加的事件委托是{2}"
, enventType, delegateFromKey.GetType(), callBack.GetType()));
}
//经过上面两个if步骤后,可以将两个事件关联
enventDic[enventType] =(CallBack)enventDic[enventType]+ callBack;//类似于链式结构
}
三.广播监听事件(无参)
//广播监听:无参
public static void BroadCast(EnventType enventType)
{
Delegate d;
if(enventDic.TryGetValue(enventType,out d))
{
CallBack callBack = d as CallBack;
if(callBack != null)
{
callBack();
}
else
{
throw new Exception(string.Format("广播事件错误,事件{0}具有不同类型的委托", enventType));
}
}
}
测试无参监听与广播
需要显示的文本框挂载脚本,代码如下,监听的委托就是显示该文本Show()方法
private void Awake()
{
gameObject.SetActive(false);
EnventCenter.AddListener(EnventType.ShowText,Show);
}
private void OnDestroy()
{
EnventCenter.RemoveListener(EnventType.ShowText, Show);
}
private void Show()
{
gameObject.SetActive(true);
}
添加鼠标监听事件,广播无参委托
private void Awake()
{
GetComponent<Button>().onClick.AddListener(() =>
{
EnventCenter.BroadCast(EnventType.ShowText);
});
}