游戏架构设计

发布于 2017-11-08  568 次阅读


预期架构的消息机制设计

第一种:通过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对象。

-


What doesn’t kill you makes you stronger.