前置:在学习完turbo强大佬的多人fps之后发觉自己在虚幻网络方面还有许多基础知识不太清楚,结合安宁Ken大佬与虚幻官方文档进行补足。
补充:官方文档中的描述挺好的,自己只算是搬运和将两者结合加强理解。
学习虚幻中的网络先从虚幻网络的架构说起:
先放上一张架构总结图:
客户端-服务器模型(C/S模式)
网络中的一台计算机作为 服务器 主持多人游戏会话,而所有其他玩家的计算机作为 客户端 连接到该服务器。然后,服务器与连接的客户端分享游戏状态信息,并提供一种客户端之间通信的方法。如下图:
在服务器上才是多人游戏实际发生的地方
客户端会远程控制其在服务器上各自拥有的 Pawn,发送过程调用以使其执行游戏操作,但服务器不会将视觉效果直接流送至客户端显示器。服务器会将游戏状态信息 复制 到各客户端,告知应存在的Actor、此类Actor的行为,以及不同变量应拥有的值。然后各客户端使用此信息,对服务器上正在发生的情况进行高度模拟。
以下是官方文档中举的一个网络多人游戏例子,分析了整个过程。(此处需要时刻注意知晓的一点在客户端和服务器上都有一个玩家Pawn,客户端会远程控制其在服务器上各自拥有的 Pawn)
玩家1在本地机器上按下输入以发射武器。
- 玩家1的本地Pawn将武器的发射命令传送给服务器上对应的Pawn。
- 玩家1在服务器上的武器生成发射物。
- 服务器告知所有的客户端生成玩家1发射物的副本
-
玩家1在服务器上的武器告知所有客户端播放武器发射音效和视觉效果。
玩家1的发射物从在服务器上的武器中射出并前移。
- 此时,服务器告知所有客户端复制玩家1发射物发生的移动,因此各客户端上玩家1的发射物便发生相应移动。
玩家1在服务器上的发射物撞击玩家2的Pawn。
- 碰撞触发摧毁服务器上玩家1发射物的函数。
-
服务器自动告知所有客户端各自摧毁玩家1发射物副本。
-
碰撞触发告知所有客户端播放附带碰撞音效和视觉效果的函数。
-
玩家2在服务器上的Pawn承受发射物碰撞造成的伤害。
-
玩家2在服务器上的Pawn告知玩家2客户端播放画面效果,作为对伤害的响应。
总结:在网络游戏中,每台不同机器上的各场景均有各自的Pawn、武器及发射物的副本。服务器是游戏真正运行的地方,但我们要让客户端的场景看似发生了相同事件。因此,需要选择性地向各客户端发送信息,以在服务器上创建场景的视觉代表。
这里穿插一下虚幻中的网络模式:
独立(StandAlone):游戏作为服务器运行,不接受远程客户端连接。参与游戏的玩家必须为本地玩家。此模式用于单人游戏和本地多人游戏。其将运行本地玩家适用的服务器逻辑和客户端逻辑。
客户端(As Client):游戏作为网络多人游戏会话中与服务器连接的客户端运行。其不会运行服务器逻辑。
聆听服务器(Listen Server):游戏作为主持网络多人游戏会话的服务器运行。其接受远程客户端中的连接,且直接在服务器上拥有本地玩家。此模式通常用于临时合作和竞技多人游戏。
专属服务器(Dedicated Server):游戏作为主持网络多人游戏会话的服务器运行。其接受远程客户端中的连接,但无本地玩家,因此为了高效运行,其将废弃图形、音效、输入和其他面向玩家的功能。此模式常用于需要更固定、安全和大型多人功能的游戏。
因为独立游戏服务器可同时作为服务器和客户端,为多人游戏创建的逻辑可在无需额外工作的情况下,在单人游戏中运行。
接下来介绍在服务器与客户端中分别存在的东西:
其中,GameMode只在服务器中存在;中间部分(GameState、Pawn、PlayerState)在服务端和客户端中都存在并且都一样,并且也是可以相互获取到的;
PlayerControlle部分,在服务端持有所有的PlayerController,客户端中分别只存在自己的Controller;
Game Instance UI在服务端和每个客户端上都是独立存在的。
这期就先到这啦~下期讲讲复制与RPC