在Unity3D中使用的Socket消息通讯模板,服务器也是Csharp写的。
客户端作为Unity3D项目的一部分,导入到Unity3D工程中,使用某个脚本的Update()
方法进行驱动;
服务器是一个单独的控制台程序,需要写一个Main
方法。
本通讯模型通过一种叫做 “消息协议” 的对象进行通讯。
消息协议通过继承自类MsgBase
来定义,本质上是一个具有特定功能的结构。
消息协议的基类:MsgBase
类,完成了对所有协议的一些通用操作,编码解码之类的操作,不要修改。
这些消息协议对象中应该包含有此消息协议应有的一些信息,比如登录协议MsgLogin
就应该至少包含userid
和pwd
两个字段(成员变量)。
实际上,继承自MsgBase后的自定义消息协议类,看起来就像是C++里的结构体一样,只有构造函数和数个公有成员变量。
写新的自定义协议时,只需要且必须继承自MsgBase
后在构造函数中为protoName
属性赋值为此协议的类名的字符串。
写新的自定义协议时,请保证服务端和客户端都添加了一模一样的新的自定义协议的类声明。
服务端需要同时在类MsgHandler
中添加与此协议同名的静态方法,用于处理在收到此协议时所要做的事情。
客户端只需要使用NetManager.AddMsgListener()
方法,来动态地监听某一消息的到来并进行对应的处理。
详细方式请分别参考目录Server和Client中的README.md
文件。
MsgHandler
中用来处理收到某消息时的静态方法,会在服务器收到并解析一条消息协议时,通过Csharp的反射机制,使用此收到的消息协议中的成员变量protoName
来找到对应的处理方法。
哦对了,客户端虽然不需要写同名的静态回调方法,但是protoName变量也应该是同名的,这个服务端和客户端没差。(简单来说就是对消息协议的类定义应该双端相同)