https://www.jianshu.com/p/666de6c7695a
之前这个在原来看来不是太完善所以重构下
代码只有在不断地重构(维护)下才会变得越来越好
根据最后项目地址下载后 创建一个新物体
image.png
这个代码放到空物体上就可以运行了
image.png
运用特性寻找UI预制体路径
之前加载窗口预制体 是根据这个表加载的 每次都要切进去添加很麻烦
image.png
因为我们的路径和名字都有规律可寻 但是要保证预制体和脚本名一样
在这个常量类中定义 把之前UIConfig类改掉
image.png
image.png
改为这样
image.png
然后这些缓存路径都可以删了
image.png
然后运行 没问题 可以把UI json也删了
消息分发优化
就是MessageCenter 这个类
用的是obj类型 在转换值类型会装箱拆箱
换成之前写的分发脚本
https://www.jianshu.com/p/02e262d60efd
之前是这么传递的
image.png
image.png
当然要把枚举改为string 字符串
差不多这样改好了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
//回调管理 不用Action因为自带的最多4个参数
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);
/// <summary>
/// 事件管理
/// </summary>
public class EventCenter
{
static Dictionary<string, Delegate> m_EventTable = new Dictionary<string, Delegate>();
static void OnListenerAdding(string 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));
}
}
static void OnListenerRemoving(string eventType, Delegate callBack)
{
if (m_EventTable.ContainsKey(eventType))
{
Delegate d = m_EventTable[eventType];
if (d == null)
{
throw new Exception(string.Format("移除监听错误:事件{0}没有对应的委托", eventType));
}
else if (d.GetType() != callBack.GetType())
{
throw new Exception(string.Format("移除监听错误:尝试为事件{0}移除不同类型的委托,当前委托类型为{1}" +
",要移除的委托的类型为{2}", eventType, d.GetType(), callBack.GetType()));
}
}
else
{
throw new Exception(string.Format("移除监听错误:没有事件码{0}", eventType));
}
}
static void OnListenerRemoved(string eventType)
{
if (m_EventTable[eventType] == null)
{
m_EventTable.Remove(eventType);
}
}
/// <summary>
/// 无参添加监听的方法
/// </summary>
/// <param name="eventType"></param>
/// <param name="callBack"></param>
public static void AddListener(string eventType, CallBack callBack)
{
OnListenerAdding(eventType, callBack);
m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callBack;
}
/// <summary>
/// 1参添加监听的方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="eventType"></param>
/// <param name="callBack"></param>
public static void AddListener<T>(string eventType, CallBack<T> callBack)
{
OnListenerAdding(eventType, callBack);
m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] + callBack;
}
/// <summary>
/// 2参添加监听的方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="X"></typeparam>
/// <param name="eventType"></param>
/// <param name="callBack"></param>
public static void AddListener<T, X>(string eventType, CallBack<T, X> callBack)
{
OnListenerAdding(eventType, callBack);
m_EventTable[eventType] = (CallBack<T, X>)m_EventTable[eventType] + callBack;
}
public static void AddListener<T, X, Y>(string eventType, CallBack<T, X, Y> callBack)
{
OnListenerAdding(eventType, callBack);
m_EventTable[eventType] = (CallBack<T, X, Y>)m_EventTable[eventType] + callBack;
}
public static void AddListener<T, X, Y, Z>(string eventType, CallBack<T, X, Y, Z> callBack)
{
OnListenerAdding(eventType, callBack);
m_EventTable[eventType] = (CallBack<T, X, Y, Z>)m_EventTable[eventType] + callBack;
}
public static void AddListener<T, X, Y, Z, W>(string eventType, CallBack<T, X, Y, Z, W> callBack)
{
OnListenerAdding(eventType, callBack);
m_EventTable[eventType] = (CallBack<T, X, Y, Z, W>)m_EventTable[eventType] + callBack;
}
/// <summary>
/// 移除某个类型所有监听
/// </summary>
/// <param name="eventType"></param>
public static void RemoveAllListener(string eventType)
{
if (m_EventTable.ContainsKey(eventType))
{
m_EventTable.Remove(eventType);
}
else
{
throw new Exception(string.Format("移除监听错误:没有事件码{0}", eventType));
}
}
/// <summary>
/// 移除无参监听的方法
/// </summary>
/// <param name="eventType"></param>
/// <param name="callBack"></param>
public static void RemoveListener(string eventType, CallBack callBack)
{
OnListenerRemoving(eventType, callBack);
m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callBack;
OnListenerRemoved(eventType);
}
/// <summary>
/// 移除1参监听的方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="eventType"></param>
/// <param name="callBack"></param>
public static void RemoveListener<T>(string eventType, CallBack<T> callBack)
{
OnListenerRemoving(eventType, callBack);
m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] - callBack;
OnListenerRemoved(eventType);
}
/// <summary>
/// 移除2参监听的方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="eventType"></param>
/// <param name="callBack"></param>
public static void RemoveListener<T, X>(string eventType, CallBack<T, X> callBack)
{
OnListenerRemoving(eventType, callBack);
m_EventTable[eventType] = (CallBack<T, X>)m_EventTable[eventType] - callBack;
OnListenerRemoved(eventType);
}
public static void RemoveListener<T, X, Y>(string eventType, CallBack<T, X, Y> callBack)
{
OnListenerRemoving(eventType, callBack);
m_EventTable[eventType] = (CallBack<T, X, Y>)m_EventTable[eventType] - callBack;
OnListenerRemoved(eventType);
}
public static void RemoveListener<T, X, Y, Z>(string eventType, CallBack<T, X, Y, Z> callBack)
{
OnListenerRemoving(eventType, callBack);
m_EventTable[eventType] = (CallBack<T, X, Y, Z>)m_EventTable[eventType] - callBack;
OnListenerRemoved(eventType);
}
public static void RemoveListener<T, X, Y, Z, W>(string eventType, CallBack<T, X, Y, Z, W> callBack)
{
OnListenerRemoving(eventType, callBack);
m_EventTable[eventType] = (CallBack<T, X, Y, Z, W>)m_EventTable[eventType] - callBack;
OnListenerRemoved(eventType);
}
/// <summary>
/// 广播无参方法
/// </summary>
/// <param name="eventType"></param>
public static void Broadcast(string eventType)
{
Delegate d;
if (m_EventTable.TryGetValue(eventType, out d))
{
CallBack callBack = d as CallBack;
if (callBack != null)
{
callBack();
}
else
{
throw new Exception(string.Format("广播事件错误:事件{0}对应的委托具有不同类型", eventType));
}
}
}
/// <summary>
/// 广播1参方法
/// </summary>
/// <param name="eventType"></param>
public static void Broadcast<T>(string eventType, T arg)
{
Delegate d;
if (m_EventTable.TryGetValue(eventType, out d))
{
CallBack<T> callBack = d as CallBack<T>;
if (callBack != null)
{
callBack(arg);
}
else
{
throw new Exception(string.Format("广播事件错误:事件{0}对应的委托具有不同类型", eventType));
}
}
}
/// <summary>
/// 广播2参方法
/// </summary>
/// <param name="eventType"></param>
public static void Broadcast<T, X>(string eventType, T arg1, X arg2)
{
Delegate d;
if (m_EventTable.TryGetValue(eventType, out d))
{
CallBack<T, X> callBack = d as CallBack<T, X>;
if (callBack != null)
{
callBack(arg1, arg2);
}
else
{
throw new Exception(string.Format("广播事件错误:事件{0}对应的委托具有不同类型", eventType));
}
}
}
public static void Broadcast<T, X, Y>(string eventType, T arg1, X arg2, Y arg3)
{
Delegate d;
if (m_EventTable.TryGetValue(eventType, out d))
{
CallBack<T, X, Y> callBack = d as CallBack<T, X, Y>;
if (callBack != null)
{
callBack(arg1, arg2, arg3);
}
else
{
throw new Exception(string.Format("广播事件错误:事件{0}对应的委托具有不同类型", eventType));
}
}
}
public static void Broadcast<T, X, Y, Z>(string eventType, T arg1, X arg2, Y arg3, Z arg4)
{
Delegate d;
if (m_EventTable.TryGetValue(eventType, out d))
{
CallBack<T, X, Y, Z> callBack = d as CallBack<T, X, Y, Z>;
if (callBack != null)
{
callBack(arg1, arg2, arg3, arg4);
}
else
{
throw new Exception(string.Format("广播事件错误:事件{0}对应的委托具有不同类型", eventType));
}
}
}
public static void Broadcast<T, X, Y, Z, W>(string eventType, T arg1, X arg2, Y arg3, Z arg4, W arg5)
{
Delegate d;
if (m_EventTable.TryGetValue(eventType, out d))
{
CallBack<T, X, Y, Z, W> callBack = d as CallBack<T, X, Y, Z, W>;
if (callBack != null)
{
callBack(arg1, arg2, arg3, arg4, arg5);
}
else
{
throw new Exception(string.Format("广播事件错误:事件{0}对应的委托具有不同类型", eventType));
}
}
}
}
然后BaseUI这两个基本可以弃用了 不然要写6遍一样的
image.png
然后把MessageCenter类删掉
报错的代码这么改
那个list的改为这个 不然会种类不同报错
image.png
image.png
然后是接收代码
image.png
image.png
image.png
正常运行