使用FishNet 构建Unity 第一人称射击游戏的联机功能
Fish-Net (Fish Networking) 是目前 Unity 社区中性能最优、功能最强大的开源免费联机框架。它的核心设计理念非常明确:用极低的 CPU 和带宽开销,提供商业引擎级别的高级网络同步特性。
要了解FishNet的网络原理,我们首先要理解一下P2P和服务器权威。
P2P(Peer-to-Peer,点对点)网络架构,是指没有中心化的服务器,每一个连接在网络上的节点(Peer)既是客户端,也是服务器。它们相互之间直接进行数据交换。
在游戏联机的世界里,“权威(Authority)”的意思非常直白:谁拥有最终裁决权,谁说了算。
当两个玩家的网络状态发生冲突时(比如玩家 A 说“我躲进了掩体”,但玩家 B 说“我在他进掩体前爆了他的头”),系统必须听从“权威”的判定。
为了更直观地理解,我们可以把联机网络想象成一个法庭。
1. 客户端权威 (Client-Authoritative)
在客户端权威的模式下,玩家自己的电脑(客户端)就是最高法官。
- 运行逻辑:玩家 A 的电脑直接在本地计算出结果:“我向左移动了 5 米,并且开枪命中了玩家 B。” 然后,玩家 A 的电脑把这个结果直接广播给所有人,服务器和其他玩家只能无条件接受这个事实。
- 最大优点:零延迟、开发极简。 因为不需要等任何人确认,玩家按下键盘的瞬间角色就会移动,开火的瞬间就会看到反馈。你写代码的方式几乎和写单机游戏一模一样。
- 致命缺点:外挂的温床。 既然客户端说了算,那么玩家只要稍微懂点内存修改(比如用 Cheat Engine),就可以让自己的客户端告诉全网:“我的血量现在是 99999,我的子弹永远打不完,且枪枪爆头。” 这是极其灾难的。
2. 服务器权威 (Server-Authoritative)
在服务器权威的模式下,服务器是唯一的、绝对的最高法官。所有客户端都只是没有决定权的“汇报者”和“执行者”。
运行逻辑:玩家 A 的电脑不能自己做主,它只能向服务器发送输入指令(Input):“报告服务器,我按下了 W 键,并按下了鼠标左键。”
服务器收到请求后,在自己的“无头游戏世界”里进行严格校验:A 前面有没有墙?A 的弹匣里还有没有子弹?A 开火时准星上有没有 B?
校验完毕后,服务器再把状态(State)广播给所有人:“A 向前移动了 2 米,B 扣除了 50 点血。”
最大优点:绝对公平与防外挂。 因为客户端无法决定任何数值,外挂修改本地内存毫无意义(比如你本地改成了无限血,但服务器后台记录你只有 100 血,被打中依然会死)。这就是为什么像 CS2 或者你正在参考的 Valorant 这类强调战术竞技的游戏,必须死死咬住服务器权威不放。
致命缺点:输入延迟(Input Lag)。 如果玩家按下 W 键,必须等数据传到服务器,服务器点头同意后再传回来,角色才开始移动。只要网络有一点波动(比如 50ms 延迟),玩家就会觉得操作像踩在泥里一样卡顿,体验极差。
这和 Fish-Net 有什么关系?
Fish-Net 骨子里就是一个强服务器权威的网络框架。当你用 Fish-Net 开发射击游戏时:
为什么我们之前要学“客户端预测 (CSP)”?
正是为了解决服务器权威带来的“延迟感”。CSP 允许客户端在汇报给服务器的同时,先偷偷在本地提前播放移动和开火动画(这就是预测)。如果稍后服务器的判定结果和客户端的预测一致,那就无事发生,玩家感觉不到任何延迟;如果不一致,服务器就会强行把客户端“拽”回正确的位置(Reconciliation)。
为什么需要“延迟补偿 (Lag Compensation)”?
因为服务器权威下,服务器看到的世界比所有客户端都要“晚一点”。当你在本地瞄准移动的敌人开火时,服务器收到指令时敌人早就走开了。延迟补偿就是让服务器能够“时光倒流”,把敌人拉回到你开火那一瞬间的位置来进行精准的射线判定。
所以,做一把好用的枪,本质上就是在这两个权威之间走钢丝:用客户端预测来保证手感,用服务器权威结合延迟补偿来保证公平。
下面将进行具体的操作。
首先在Asset Store中导入资源到项目中。
首先我们在场景中添加NetWorkManager组件,然后我们创建一个平面,再创建一个立方体,命名为Player,将其在场景中调整好位置,然后添加上Network Object脚本,最后做成预制体。
然后我们找到刚刚的manager,把我们的预制体拖拽上去。
打包测试,我们的编辑器作为server+client(两个按钮都要按),打包的软件作为client,两者均运行起来,可以看到,打包的Player也加入到了作为server的编辑器中。
下面我们添加移动脚本如下:
using UnityEngine; |
然后便能在两边操作物体移动并且观察到对方了。


