Unity3d实战之Unity3d网络游戏实战篇(12):客户端网络模块
学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版社
本文是作者在学习过程中遇到的认为值得记录的点,因此引用的代码等资源基本出资罗培羽老师的书籍,如有侵权请联系,必删。
客户端的网络部分需要处理的数据并没有服务端那么多,要做的事情还是有相似之处的。流程:
异步Socket接收消息 -> 消息按顺序存入消息列表 -> 依次处理先接收到的消息 -> 根据消息类型执行不同的逻辑。
注意,客户端给服务端发送数据后,服务端会返回相应的处理结果,我们通过建立监听表来实现对返回消息的监听,当客户端发送数据后,注册相应的监听事件,当接收到对应的返回消息时,调用相应的处理方法。监听表分两类,一种是永久监听,一种是一次性监听。但是,有时候我们接收到返回消息时需要调用多个处理方法,我们可以通过使用委托来实现。
1、建立MsgDistribution类管理消息列表和监听表。
用到的变量有:
public delegate void MsgDelegate(ProtocolBase protoBase);
public List<ProtocolBase> msgList = new List<ProtocolBase>();
public int maxMsgCount = 15;
private Dictionary<string, MsgDelegate> eventDict = new Dictionary<string, MsgDelegate> ();
private Dictionary<string, MsgDelegate> onceDict = new Dictionary<string, MsgDelegate> ();
其中:
MsgDelegate:委托类型,它能够引用其他的方法,跟C/C++中的函数指针类似,可以避免使用大量的if-else等语句的问题。但注意,引用的方法必须和MsgDelegate具有相同的参数和返回值类型;
msgList:消息列表,保存从服务端接收到的消息,先入先出原则;
maxMsgCount:每帧处理的最大消息数;
eventDict:永久性监听表,注册之后一直保持监听特定消息,key为监听的协议名,value为回调方法;
onceDict:一次性监听表,注册之后只监听一次,key为监听的协议名,value为回调方法;。
定义用于添加事件和删除事件的方法:
#region Extra Operation
///