预期架构的消息机制设计
第一种:通过Msg -> Manager -> Script
第二种:通过Msg -> Manager -> Server -> Manager -> Script
消息机制参考IP的形式,通过MsgID可以知道当前的消息的来源。
[cc lang="csharp"]
public enum ManagerID {
GameManager = 0,
UIManager = FrameTools.MsgSpan 2,
AudioManager = FrameTools.MsgSpan 3,
NPCMananger = FrameTools.MsgSpan 4,
CharactorManager = FrameTools.MsgSpan 5,
AssetManager = FrameTools.MsgSpan 6,
NetManager = FrameTools.MsgSpan 7
}
public class FrameTools {
public const int MsgSpan = 3000;
}
[/cc]
我们需要提供一个MsgBase类,用于存放和管理MsgID,并提供根据MsgID找到对应的ManagerID的方法。
[cc lang="csharp"] public class MsgBase { public ushort msgID; /// <summary> /// 根据msgID 的大小和MsgSpan的关系,算出当前消息属于那个Manager中 /// </summary> /// <returns>The manager.</returns> public ManagerID GetManager() { int tempID = msgID / FrameTools.MsgSpan; return (ManagerID)(tempID * FrameTools.MsgSpan); } public MsgBase(ushort tempMsg) { msgID = tempMsg; } } [/cc]
Manager的功能:
- 存储对应的注册进来的msg
- msg进来以后,找到对应的脚本
如果采用Dictionary<ushort, Mono>的方式存取,并不能实现一个Msg对应多个Script的功能。
在这里需要自定义一个数据结构,以链表的形式存储其他的msg。
除了数据的存取,这里的ManagerBase类还需要提供处理消息、注册和取消注册的方法。
[cc lang="csharp"]
public class ManagerBase : MonoBase {
public override void ProcessEvent(MsgBase tmpMsg){}
public void RegistMsg(MonoBase mono, params ushort[] msgs) {}
public void RegistMsg(ushort id, EventNode node) {}
[/cc]
}
为了方便管理和之后的扩充,所以这里的ManagerBase需要继承于MonoBase类。
[cc lang="csharp"] public abstract class MonoBase : MonoBehaviour { public abstract void ProcessEvent(MsgBase tmpMsg); } [/cc]
数据结构设计
[cc lang="csharp"]
public class EventNode {
public MonoBase data;
public EventNode next;
public EventNode(MonoBase tempMono) {
this.data = tempMono;
this.next = null;
}
}
[/cc]
这里定义一个EventNode的Class,存储Mono的data信息,并存储此msg的next。
[cc lang="csharp"] public Dictionary<ushort, EventNode> eventTree = new Dictionary<ushort, EventNode>(); [/cc]
并在类ManagerBase中创建存储注册的信息dictionary对象。