GameFramework 开发脚手架之 Network网络框架

538 阅读3分钟

项目 github地址

打开项目选GameLauncher场景,直接启动游戏。我用的是 Unity 2021.3.6f1 版本。但应该是2017之后的都支持,没有实测过。

参考

GameFramework框架详解之 Network网络框架

老规矩,先看上面这篇文章,掌握大致的原理。

简单总结一下

  1. 框架里,每一种Tcp 或者 Udp 都叫做一种Channel。目前GameFramework框架只实现了Tcp,类名叫 TcpNetworkChannel,如果要实现Udp,要自己参考实现。
  2. NetworkChannelHelper 实现了INetworkChannelHelper接口,实现业务协议封包和解包。你想用json和protobuf都可以,主要就是在这里改了。
  3. 用的时候,先用NetworkChannelHelper初始化channel,链接服务器,然后持有channel,就可以发送和接收数据了。
_channel = NetworkComponent.CreateNetworkChannel("Default", ServiceType.Tcp, new NetworkChannelHelper());  
_channel.Connect(IPAddress.Parse(ip), port);

二次封装做了什么

  1. 提供了NetworkChannelHelper的一般实现,按照一般的用法进行封装。
  2. 提供了protobuf的生成工具,在下一章详细讲解如何根据protobuf文件生成对应的C#类。
  3. 对业务层提供统一的接口 NetworkMgr。
  4. 提供了一个Tcp服务器端的简单实现,可以用来做协议层的测试。

使用

  1. 把生成的protobuf类放到Assets/GameMain/Scripts/Game/Network/protobuf/gen 下面。
  2. 在每个对应的handy文件里进行扩展,比方Avatar_EX.cs,这个扩展文件要保留,不是自动生成的。从客户端到服务端的协议要继承PacketC2S,从服务端到客户端的协议要继承PacketS2C。
  3. 在PbC2SId配置要C2SId 和S2CId。
  4. 在合适的地方初始化NetworkMgr,并连接上服务器。
  5. 通过NetworkMgr的send方法发送客户端到服务端的协议。
  6. 在NetworkAgent做服务端到客户端C2S协议的路由分发。

1698028267628.png

目录结构-框架

1698028800804.png 框架相关的封装在Assets/GameMain/Scripts/Base/FrwMgrs/Network。

  1. Packet下面的是和封包解包相关的类。
  2. NetworkChannelHelper是交互的核心,提供网络初始化,发包的封包过程,接收到服务端协议的解包过程和路由。
  3. INetworkAgent是路由代理,业务层按自己的要求进行路由的实现。
  4. NetworkMgr是提供给业务层的统一管理类,网络初始化(需要提供INetworkAgent的实现),协议包的发送等。
  5. NetworkUtils提供了大小端转换的实现,C#是小端的,网络传输变用的是大端,所以最好统一转成大端。

目录结构-业务层

1698029201844.png

  1. gen下面是自动生成的protobuf协议类。
  2. handy是对生成协议的一些手动扩展,需要保留。
  3. PbMsgId对协议id进行统一管理,需要前后端保持一致。
  4. NetworkAgent主要是路由逻辑。

目录结构-测试

1698029407285.png

参考 # GameFramework 二次封装之 启动测试流程,然后把TestNetwork的OnEnter 和OnUpdate 方法配置到 ProcedureTest 里面就可以进行测试了。

测试服务器在项目根目录的TcpTestSvr,分发逻辑在RouterC2S。这是个控制台应用程序,你可以自己打包之后执行exe启动,也可以在编辑器里边debug启动方便调试。 1698029840138.png