项目 github地址
打开项目选GameLauncher场景,直接启动游戏。我用的是 Unity 2021.3.6f1 版本。但应该是2017之后的都支持,没有实测过。
参考
GameFramework框架详解之 Network网络框架
老规矩,先看上面这篇文章,掌握大致的原理。
简单总结一下
- 框架里,每一种Tcp 或者 Udp 都叫做一种Channel。目前GameFramework框架只实现了Tcp,类名叫 TcpNetworkChannel,如果要实现Udp,要自己参考实现。
- NetworkChannelHelper 实现了INetworkChannelHelper接口,实现业务协议封包和解包。你想用json和protobuf都可以,主要就是在这里改了。
- 用的时候,先用NetworkChannelHelper初始化channel,链接服务器,然后持有channel,就可以发送和接收数据了。
_channel = NetworkComponent.CreateNetworkChannel("Default", ServiceType.Tcp, new NetworkChannelHelper());
_channel.Connect(IPAddress.Parse(ip), port);
二次封装做了什么
- 提供了NetworkChannelHelper的一般实现,按照一般的用法进行封装。
- 提供了protobuf的生成工具,在下一章详细讲解如何根据protobuf文件生成对应的C#类。
- 对业务层提供统一的接口 NetworkMgr。
- 提供了一个Tcp服务器端的简单实现,可以用来做协议层的测试。
使用
- 把生成的protobuf类放到Assets/GameMain/Scripts/Game/Network/protobuf/gen 下面。
- 在每个对应的handy文件里进行扩展,比方Avatar_EX.cs,这个扩展文件要保留,不是自动生成的。从客户端到服务端的协议要继承PacketC2S,从服务端到客户端的协议要继承PacketS2C。
- 在PbC2SId配置要C2SId 和S2CId。
- 在合适的地方初始化NetworkMgr,并连接上服务器。
- 通过NetworkMgr的send方法发送客户端到服务端的协议。
- 在NetworkAgent做服务端到客户端C2S协议的路由分发。
目录结构-框架
框架相关的封装在Assets/GameMain/Scripts/Base/FrwMgrs/Network。
- Packet下面的是和封包解包相关的类。
- NetworkChannelHelper是交互的核心,提供网络初始化,发包的封包过程,接收到服务端协议的解包过程和路由。
- INetworkAgent是路由代理,业务层按自己的要求进行路由的实现。
- NetworkMgr是提供给业务层的统一管理类,网络初始化(需要提供INetworkAgent的实现),协议包的发送等。
- NetworkUtils提供了大小端转换的实现,C#是小端的,网络传输变用的是大端,所以最好统一转成大端。
目录结构-业务层
- gen下面是自动生成的protobuf协议类。
- handy是对生成协议的一些手动扩展,需要保留。
- PbMsgId对协议id进行统一管理,需要前后端保持一致。
- NetworkAgent主要是路由逻辑。
目录结构-测试
参考 # GameFramework 二次封装之 启动测试流程,然后把TestNetwork的OnEnter 和OnUpdate 方法配置到 ProcedureTest 里面就可以进行测试了。
测试服务器在项目根目录的TcpTestSvr,分发逻辑在RouterC2S。这是个控制台应用程序,你可以自己打包之后执行exe启动,也可以在编辑器里边debug启动方便调试。