
虚幻UE引擎广泛支持网络多人游戏的开发,那么本教程将解释一下用UE创建网络多人游戏的各个类的设计和作用。
在本文中,无论使用Listen服务器还是Dedicated服务器,想法本身都是相同的。请记住,对于Listen服务器,服务器必须完成工作,包括客户端处理。
游戏框架(Gameplay Framework)的作用
UE引擎从一开始就有一个叫做Gameplay Framework的机制,即使不是创建网络游戏也很有用,但它本质上是为创建网络游戏准备的机制,下面是比较重要的内容。
- 游戏模式
- 游戏状态
- 游戏实例
- Pawn
- 玩家控制器
- 玩家状态
- UMG小部件和 HUD
UE引擎的网络采用了一种叫做Client-Server model的架构,这意味着服务器管理所有游戏信息,而客户端只显示它收到的结果。
分为以下四种:
- Server only → 顾名思义,它只存在于服务器上。
- 服务器和客户端 → 服务器和所有客户端上存在的内容。
- 仅服务器和拥有客户端 → 仅存在于服务器和拥有它的客户端上。
- 仅拥有客户端 → 服务器上不存在的东西,但只存在于拥有它的客户端上。
下图是上面分配给每个类的图片说明:

现在可以更轻松地查看哪些类位于客户端和服务器的哪个位置,这些游戏框架中的每一个都为每个类分配了不同的角色,应该相应地使用,现在让我们来看看每个角色的作用。
游戏模式(Game Mode)
首先是游戏模式,许多人以前都使用过这个类,但是网络上的游戏模式只存在于服务器上,这是管理只有服务器需要知道的信息的地方,主要管理游戏规则和服务器驱动的游戏进度。
游戏模式是唯一可以在每个客户端登录或注销时分别使用OnPostLogin和OnLogout事件处理登录后和其他处理的模式。实际上,可以仅初始化客户端,并且可以在OnPostLogin中获取 Player Controller,因此通过将其保持在Game Mode中,可以在服务器上管理单个客户端信息。
客户端登录后还可以通过Player Controller初始化widgets等。
游戏状态(Game State)
Game State顾名思义就是管理游戏的状态,但是Game State在服务端和客户端之间共享一个东西作为一个整体,客户端通过在服务端发送一次RPC来复制,变量会被共享由所有客户。
Game State最适合管理登录游戏后游戏开始进行时的进度和总分,优点是可以全局处理,服务端和客户端都可以处理。
游戏实例(Game Instance)

游戏实例在整个游戏过程中始终存在,存在于服务器和所有客户端上。但是,它不像其他类那样共享实例。换句话说,它适用于管理只想保留在本地的信息。
具体来说,在登录时使用的账户信息以及在开始游戏后希望保留的信息。另外,Game Instance是唯一可以管理登录前和退出后的信息的,所以即使出现问题,它也有非常重要的作用。
即使断网,也只有Game Instance可以跟踪信息,所以如果要处理网络错误,就要用到这个Game Instance。
Pawn

Pawn是游戏中可玩的角色,很多人实际上使用继承自Pawn的Character类。Pawns与Player Controller和Player State有着密切的关系,在登录游戏后,Player Controller将对生成的Pawn使用Possess来占有角色
Pawn还可以通过在游戏中切换到另一个Pawn来控制另一个角色。或者可以通过在角色死亡或被摧毁时重生来再次更改角色。
Pawn本质上是游戏中的一个角色,所以它存在于服务器和所有客户端,但是需要记住的是Pawn的所有权和信息是由Player Controller管理的,如果角色在中间切换,信息也会消失。
玩家控制器(Player Controller)

Player Controller是客户端最重要的东西,每个客户端将只有一个单独的播放器控制器,尽管它当然会存在于服务器上。换句话说,客户端A和客户端B不共享彼此的Player Controller信息。
Player Controller在客户端拥有最大的权限,因为它是客户端登录游戏后唯一可以识别的对象。如果中途切换了Pawn,那个Pawn的信息会丢失,但是Player Controller的信息不会消失。
另外,由于UMG Widget等UI是只存在于各个客户端的信息,所以基本上需要Player Controller来管理。甚至在与服务器通信时,RPCs也会从这个Player Controller发送,因此在创建客户端时会亏欠很长时间。
玩家状态(Player State)

Player State管理玩家的状态,与Game State不同的是,它是为每个客户端创建的,Player Controller在一定程度上也可以被替代,但与Player Controller不同的是,它存在于服务端和所有客户端,因此可以共享。
如果Game State管理游戏的状态,那么这是管理玩家特定信息的实体,例如生命值和自己的分数。即使Pawn被摧毁或重生,玩家状态仍然存在,因此它非常适合在多场比赛中管理玩家信息。
UMG小部件和HUD
最后,来谈谈UMG Widgets和HUD,它作为UI存在于游戏中,但不存在于服务器中,因为每个客户端的外观都是独一无二的,每个客户端都需要根据Player Controller和Player State等信息创建视觉部分。
此外,它必须在服务器端为每个客户端创建,并且必须通过从所属客户端上的Player Controller执行RPC(Run on Owning Client)为每个客户端单独完成,这有点复杂。
由于该信息只存在于每个客户端中,可以说是管理起来比较困难的部分。
总结
虚幻UE引擎的联网多人游戏以不同的方式使用这些类,从而为创建联网游戏提供了极大的灵活性,下面是基本指导:
- 游戏模式管理服务器特定信息并围绕登录和注销流动,并且尽可能没有不必要的功能。
- 让Game State管理游戏的进度,同时也在这里收集游戏过程中客户端的信息。
- Game Instance有游戏登录前和退出后的账号信息和必要信息,也有处理断网等错误。
- Player Controller将成为客户端向服务器发送RPC时的枢纽,并将成为控制Pawn、Player State、UMG Widgets等的基础。
- 除了Player Controller之外,Pawn和Player State after Possessment也可以向服务器 发送RPC,但是个人角色的发挥比较困难,所以尽量不要这样做。
以上的基本指导做一个网络游戏在很多方面确实很复杂,但是如果在设计的时候明白了这些东西,绝对可以很顺利的做出一个网络游戏。
…
以上是3D天堂关于在虚幻引擎中开发网络多人游戏的全部内容,如果你有任何反馈,请随时在本页面下方留言。