更新日期:2026年8月4日。
项目源码:获取源码。
免责声明:本系列所使用的图片、音频、模型等所有素材均有可能来自互联网,本专栏所有文章仅做学习和教程目的,不会将任何素材用于任何商业用途。
索引
- 【系列简介】
- 【帧同步】
- 【内容简介】
- 一、uNet网络游戏服务端框架
- 二、TankBattle服务端
- 1.心跳机制
- 2.大厅功能
- 3.帧同步
- 4.基于Protobuf的高性能数据交互
- 三、TankBattle客户端
- 1.超多关卡
- 2.单人模式
- 3.联机模式
- 4.战斗回放
【系列简介】
本系列会复刻FC经典游戏《坦克大战》(Battle City),并以帧同步技术实现多人联机模式,且具备双端互联(PC端和安卓移动端),战斗回放等功能。
FC上的《坦克大战》(Battle City)于1985年发布,其源自南梦宫(Namco)1980年推出的一款街机游戏《Tank Battalion》,FC版在玩法、画面和关卡上都做了很多经典改良,其远不止是一款射击游戏,它集合了简单的上手体验、有深度的策略、丰富的隐藏要素和双人合作的乐趣,成为了一代人的童年回忆。
在Unity中还原它略有一些挑战性(要做到1:1还原,操作手感、画面、音效等),当然,我们的核心功能是使用帧同步技术将其网络化,帧同步技术作为高性能实时对战游戏最精妙的架构之一,本系列将带你摘下这颗镶嵌在网络游戏开发领域皇冠上的明珠。
【帧同步】
在网络游戏开发中,帧同步(Lockstep,或更准确地说是帧锁定同步)是一种常见的同步策略,尤其在即时战略(RTS,如《星际争霸》《帝国时代》)、格斗游戏(如《街霸》系列)以及部分MOBA(如《王者荣耀》)中广泛应用。
简单来说,帧同步的核心思想是:客户端之间不直接同步每个单位的具体状态(位置、血量等),而是只同步玩家的输入指令(操作),所有客户端在相同的逻辑帧上执行完全相同的指令序列,从而自行计算出完全一致的游戏世界状态。
【内容简介】
本系列将涵盖如下内容或技术要点:
一、uNet网络游戏服务端框架
uNet为本人使用.Net Core开发的高性能、高并发网络游戏服务端框架,可适用于多人在线类游戏、匹配对战类游戏,支持心跳机制,状态同步,基于Protobuf的高性能数据交互等(在状态同步的基础上改进便支持帧同步)。
没错,本系列与上一系列(【Unity网络游戏实战】MMORPG + 中国象棋联网对战)使用同样的服务端框架,所以很多东西是相同的,本系列可能会稍作精简。
注:
uNet源码会附带在本系列源码包中。
二、TankBattle服务端
TankBattle的服务端程序基于uNet框架实现,支持身份认证、心跳机制、大厅功能、匹配功能、帧同步、基于Protobuf的高性能数据交互等。
注:
TankBattle服务端源码会附带在本系列源码包中。
1.心跳机制
当有任意客户端连入服务端以后,服务端会每隔指定时间向其发送心跳包,如果心跳包超时未送达,或客户端未在指定时间内响应心跳包,则判定为心跳超时,会主动将该客户端踢出服务器。
2.大厅功能
大厅用于容纳所有登入服务器(但未进行匹配游戏)的玩家,在大厅中的玩家进行匹配时,可使用自定义匹配算法为其匹配队友,匹配成功后正式进入游戏关卡。
3.帧同步
帧同步是TankBattle的核心技术点,其工作流程可以分为以下几个关键步骤:
- 逻辑帧与渲染帧分离
- 逻辑帧:游戏逻辑(如移动、攻击、碰撞检测)更新的固定时间间隔。通常是固定的,比如每秒20帧或30帧逻辑帧(对应逻辑帧间隔50ms或33.3ms)。
- 渲染帧:图形引擎实际绘制画面的频率(也即是Unity中的Update),可以很高(60fps、144fps),取决于设备性能。
- 帧同步只关注逻辑帧。
- 帧生命周期
- 收集输入:在一个逻辑帧周期内,客户端收集本地玩家在这一帧内的所有操作(按下移动键、释放技能、鼠标点击等)。
- 打包提交:客户端将这一帧的输入指令打包成一个帧指令包,并发送给服务器。
- 等待全局帧:客户端必须等待所有玩家在这一逻辑帧的指令都到达本地,才能前进到下一逻辑帧。(由服务器收集完所有玩家的输入指令后,统一广播全局帧)。
- 执行帧:一旦确认收到了所有玩家在当前帧的指令,所有客户端将这些指令作为输入,在同一逻辑帧内同步执行游戏逻辑,推进游戏状态。
- 渲染:根据更新后的游戏状态,渲染线程在各个渲染帧绘制画面(也即是Unity中的Update)。
- 确定性(Determinism)是基石
- 这是帧同步能够成立的前提。所有客户端的游戏逻辑(包括物理引擎、随机数生成器、碰撞检测顺序等)必须是完全确定的。
- 这意味着:给定完全相同的初始状态和完全相同的输入指令序列(包括顺序和时间间隔),在任何设备、任何环境下运行,都应该得到完全一致的游戏世界状态。
4.基于Protobuf的高性能数据交互
TankBattle使用Protobuf进行数据交换,这是公认的高性能数据交换格式。
【Unity】使用ProtobufNet处理数据。
三、TankBattle客户端
TankBattle的客户端程序基于HTFramework框架实现。
注:
TankBattle客户端源码会附带在本系列源码包中。
1.超多关卡
共有2147483647个关卡,单人模式时可在选择关卡界面手动选择目标关卡,联机模式默认从第一关开始。
PS:其实是因为关卡生成算法使用一个int型作为种子,不同的种子随机生成不同的关卡,但相同的种子生成的关卡始终是一致的。
2.单人模式
玩家可进行单人游戏模式,单人模式无需帧同步,不需要服务器的全局帧驱动,使用本地逻辑帧时钟进行游戏状态推进,所以不受网络影响:
【Unity】TankBattle单人模式
3.联机模式
玩家可进行联机游戏模式,联机模式需要帧同步,所有玩家由服务器的逻辑帧时钟驱动,且由于我们在确定性上做出的努力,每个玩家看到的游戏画面始终是一致的:
【Unity】TankBattle联机模式
4.战斗回放
玩家可进行战斗回放,所有由玩家本身参与过的关卡(无论单人模式还是联机模式),本地都会保存为战斗回放,可随时浏览回放(回放中可加速):
【Unity】TankBattle战斗回放
战斗回放是录屏吗?当然不是!还记得上文中的这句话吗:
给定完全相同的初始状态和完全相同的输入指令序列(包括顺序和时间间隔),在任何设备、任何环境下运行,都应该得到完全一致的游戏世界状态
战斗回放便是基于此实现的。
本系列后续的章节将循序渐进展开对各个内容以及技术要点的详解,欢迎关注。