https://www.jianshu.com/p/666de6c7695a
之前这个在原来看来不是太完善所以重构下
代码只有在不断地重构(维护)下才会变得越来越好
根据最后项目地址下载后 创建一个新物体
![](https://img.haomeiwen.com/i15146729/b63b79bae6a415ad.png)
这个代码放到空物体上就可以运行了
![](https://img.haomeiwen.com/i15146729/e95e7a61956b06b9.png)
运用特性寻找UI预制体路径
之前加载窗口预制体 是根据这个表加载的 每次都要切进去添加很麻烦
![](https://img.haomeiwen.com/i15146729/403728f2b5eb2d34.png)
因为我们的路径和名字都有规律可寻 但是要保证预制体和脚本名一样
在这个常量类中定义 把之前UIConfig类改掉
![](https://img.haomeiwen.com/i15146729/0c96f69d54c25eda.png)
![](https://img.haomeiwen.com/i15146729/02367f26d103d5fa.png)
改为这样
![](https://img.haomeiwen.com/i15146729/62f8f9bf017a764e.png)
然后这些缓存路径都可以删了
![](https://img.haomeiwen.com/i15146729/ba5945b14b009ea9.png)
然后运行 没问题 可以把UI json也删了
消息分发优化
就是MessageCenter 这个类
用的是obj类型 在转换值类型会装箱拆箱
换成之前写的分发脚本
https://www.jianshu.com/p/02e262d60efd
之前是这么传递的
![](https://img.haomeiwen.com/i15146729/5bd9a745848ef081.png)
![](https://img.haomeiwen.com/i15146729/148b9248704b78fd.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遍一样的
![](https://img.haomeiwen.com/i15146729/0f0c5ac6704fda11.png)
然后把MessageCenter类删掉
报错的代码这么改
那个list的改为这个 不然会种类不同报错
![](https://img.haomeiwen.com/i15146729/6738dd468f94d5a2.png)
![](https://img.haomeiwen.com/i15146729/60d2a9387fb57b1f.png)
然后是接收代码
![](https://img.haomeiwen.com/i15146729/1445304946c00cc1.png)
![](https://img.haomeiwen.com/i15146729/843b0805c1ff91d2.png)
![](https://img.haomeiwen.com/i15146729/b44c2d8e54fb8ba2.png)
正常运行
网友评论