个人学习笔记
来源01:siki学院“Unity3d事件的监听与广播系统”
方式一 siki学院采用委托
消息类型 枚举
public enum EventType
{
ShowText,
}
回调函数 委托 相当于Action
public delegate void CallBack();
public delegate void CallBack<T>(T arg);
public delegate void CallBack<T, X>(T arg1, X arg2);
public delegate void CallBack<T, X, Y>(T arg1, X arg2, Y arg3);
public delegate void CallBack<T, X, Y, Z>(T arg1, X arg2, Y arg3, Z arg4);
public delegate void CallBack<T, X, Y, Z, W>(T arg1, X arg2, Y arg3, Z arg4, W arg5);
消息事件的基类 初始化消息 消息底层实现(添加、移除、回调)
笔记:
使用Dictionary存放 消息类型(Key),委托(Value);
添加、移除即向Dictionary中添加、删除键、值;
广播(Broadcast):传入消息类型(key),在Dictionary获得对应的委托(Value),然后回调。
(由于委托能包装的方法有一定限制:方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序,,所以扩展比较麻烦),则每个回调(委托)都要重新封装一个函数
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventCenter
{
private static Dictionary<EventType, Delegate> m_EventTable = new Dictionary<EventType, Delegate>();
private static void OnListenerAdding(EventType eventType, Delegate callBack)
{
if (!m_EventTable.ContainsKey(eventType))
{
m_EventTable.Add(eventType, null);
}
Delegate d = m_EventTable[eventType];
if (d != null && d.GetType() != callBack.GetType())
{
throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托是{1},要添加的委托类型为{2}", eventType, d.GetType(), callBack.GetType()));
}
}
private static void OnListenerRemoving(EventType eventType, Delegate callBack)
{
if (m_EventTable.ContainsKey(eventType))
{
Delegate d = m_EventTable[eventType];
if (d == null)