定义参考[[Protobuf通信协议]]即可; 如果要使用,Protobuf通信协议,需要先用到,对应的程序集; 在微软的,官方NuGet软件包平台,就可以下载使用; 右键,测试工程 ![[Pasted image 20240418133310.png]] 可以看到,是有下载和安装了,对应的软件包,也隐式安装了,与之对应的,Core核心库 ![[Pasted image 20240418133327.png]] unity客户端,同理,也是集成了,对应的软件包dll程序集 ![[Pasted image 20240418133414.png]] 测试工程,先弄一个Person协议类,需要加上ProtoContract标签,其中也会加上ProtoMember,和tag数字索引,标识协议包含的数据 ![[Pasted image 20240418133456.png]] 再弄一个Address地址相关的协议类,也是加上ProtoContract和ProtoMember标签,而且嵌套在Person协议类里; 不管是哪个协议类,都需要加上Serializable标签,标识可序列化; ![[Pasted image 20240418133653.png]] 使用原生的Serialize序列化接口,对Person协议类,进行序列化 ![[Pasted image 20240418133955.png]] 与之对应的,原生,解序列化函数接口 ![[Pasted image 20240418134054.png]] 调用原生序列化、解序列化的TestBasicNormal函数接口,完成Person和Address协议类的构建后,序列化person到data字节数组,再直接DeSerialize解序列化变回Person,打印其中的字段 ![[Pasted image 20240418142236.png]] Main函数调用,运行,log正常 ![[Pasted image 20240418142433.png]] ![[Pasted image 20240418142444.png]] ![[Pasted image 20240418142506.png]] TestBasicPB函数接口,是用来测试Protobuf的,最开始也是完成,Person和Address协议类的构建,然后调用Protobuf内部的Serializer逻辑,对应的Serialize序列化、Deserialize解序列化接口; 然后,也是打印log信息; ![[Pasted image 20240418142640.png]] ![[Pasted image 20240418142848.png]] 继续,测试创建一个person.bytes字节文件,序列化写入,然后,解序列化读取,打印log ![[Pasted image 20240418142924.png]] 主函数调用,打印log正常 ![[Pasted image 20240418143009.png]] ![[Pasted image 20240418143035.png]] 测试使用的,是UDP网络通信,与之对应的,协议类,其中CMD枚举,是用于通信的Head头部标识,包含 LogicLogin登录相关、BagInfo背包相关; 还有一个Error枚举,是用于错误码的逻辑处理; ![[Pasted image 20240418150003.png]] 背包协议,对应的ReqBagInfo请求、RspBagInfo接收,其中背包结构BagItem ![[Pasted image 20240418153401.png]] 登录协议,ReqLogicLogin请求,有acct账号、pass密码结构,RspLogicLogin接收,对应UserData用户数据,结构为uid、name名字、level等级、exp经验 ![[Pasted image 20240418153545.png]] 还有俩测试连接的,请求接收,分别是ReqXXXOOO、RspXXXOOO; 消息主体是Body结构,包含上述解析的,协议结构; ![[Pasted image 20240418153754.png]] Head是头部,包含CMD协议标识的枚举,而Pkg就是,头部 + 消息主体,的网络消息包 ![[Pasted image 20240418153919.png]] 常规的Serialize序列化、DeSerialize解序列化工具接口 ![[Pasted image 20240418154108.png]] ![[Pasted image 20240418154137.png]] UDP跟TCP不一样的地方,其中一点是,Socket连接上,没有很明确的,客户端和服务端的区分 ![[Pasted image 20240418155311.png]] 服务端的ReqLogin登录请求,响应逻辑:打印消息主体Body的acct账号、pass密码信息; 然后,构建一个Body消息主体,再调用服务端根逻辑ServerRoot的SendMsg函数接口,完成消息回发 ![[Pasted image 20240418155428.png]] SendMsg函数接口,对应的具体逻辑,就是构建Pkg消息包,使用常规的Serialize序列化工具,得到字节数组,通过udp发送即可 ![[Pasted image 20240418155642.png]] 服务端的背包ReqBagInfo请求响应,也是在打印log之后,构建,背包RspBagInfo回包,对应的Body消息主体,也是调用,SendMsg函数接口,发回给客户端即可 ![[Pasted image 20240418155752.png]] 服务端,逻辑根节点,声明了udp端、还有登录login和背包bag,对应协议的Handler事件逻辑; 弄一个Instance单例; ![[Pasted image 20240418160004.png]] ServerRecive函数接口,使用[[await]]异步接收,udp网络消息,然后调用,常规的DeSerialize 解序列化工具; switch消息包的head头部cmd枚举,对应的协议类型,调用 登录相关loginHandler 或 背包相关 bagHandler 的响应逻辑即可; ![[Pasted image 20240418160133.png]] 根逻辑点,对应的Init初始化,就是各个Handler的实例化对象,再开一个udp连接,使用[[Task]]创建一个ServerRecive接收消息的任务即可 ![[Pasted image 20240418160435.png]] 对应的Main主函数,调用Init初始化,开启服务器 ![[Pasted image 20240418160651.png]]