虚幻多人游戏的C++开发新手入门指南
你想制作一款多人游戏吗?这是最难制作的一类游戏。可如果你是一名多人游戏的粉丝,你就应该知道自己是无法与全世界的玩家直接对战的。
虚幻引擎是一款非常强大的游戏引擎,能提供绝佳的“开箱即用”型多人游戏支持。我们推出的这篇“新手入门指南”将助你完成版图规划,开始制作属于你自己的多人游戏。
本文将概述我们在详细的Udemy课程中所涵盖的各类课题。通过23个多小时的视频教学和练习,我们能够在课上更加详细地教授这些概念(更多信息,请见本文结尾处)。
使用正确的工具
多人游戏的性质完全不同,因此有着不同的要求。虚幻引擎适用于某几类多人游戏。但这并不表示它不能适用于其他种类的游戏,仅仅说明你同时还需要其他一些工具。
![](https://www.0419af.com/wp-content/uploads/2023/02/1675356051-46a309f1022ff0c.png)
*对于MMO类的游戏,请查看Improbable.io。这些工具与虚幻引擎集成后,可以使MMO中某些较为困难的问题变得简单。
利用虚幻引擎制作的游戏会话时间短,可以使同步类的玩法变得非常简单。这意味着,只要你愿意,就可以制作出FPS、大逃杀、赛车、格斗类甚至是“我的世界”类的游戏!它拥有着无限的可能性。
我们按照多人游戏的生命周期,将虚幻引擎的多人游戏支持具体分为以下3步:
发现 连接 同步虚幻引擎有多简单?
尽管连接测试实施起来非常难,但虚幻引擎却能让它变得超级简单。我们以FPS为例,你只需按下“播放”,选择需要的玩家人数,然后点击“新编辑器窗口(PIE)”即可。
为什么这样就可以了呢?因为大部分工作都由虚幻引擎中的众多组件完成了。
以下是虚幻引擎为你完成的部分工作:
虚幻引擎加载地图 地图指定游戏模式 将玩家控制器加入地图 请求游戏模式生成一个Pawn 将Pawn连接到玩家控制器。
此外,它还将通过网络连接完成所有这些工作。
建立网络连接
网络连接几乎和虚幻引擎一样简单。你可以通过命令行轻松启动您的游戏。Windows上的命令提示符或命令行工具Powershell以及Mac上的终端程序都能很好地完成这个任务。
如需启动服务器,你可以使用以下命令行。将端口换为你想要的端口,并给予其到达你项目和地图的正确路径。
“C:\Program Files\UE_4.17\Engine\Binaries\Win64\UE4Editor.exe” “C:\PATH_TO_MY_PROJECT.uproject”/Game/ThirdPersonCPP/Maps/ThirdPersonExampleMap -server -log -port=8003
一旦服务器启动,你就可以轻松实现客户端与服务器之间的连接了。注意,你无需提供地图。相反,你需要提供一个IP地址给玩家控制器,以便与之连接。请确保更换正确的IP地址和端口。
“C:\Program Files\UE_4.17\Engine\Binaries\Win64\UE4Editor.exe” “C:\PATH_TO_MY_PROJECT.uproject” 192.168.1.90:8003 -game -log
Mac上的路径稍微有些不同,但剩下的大部分内容几乎一样。
运行
现在,我们不指望我们的用户能够做这样的事情,因此你可以创建UI,通过驱动ServerTravel和ClientTravel功能来完成这件事情。
我们的基本理念是,要将玩家控制器与某一地图断开连接,然后与另一地图重新连接。不同之处在于,ServerTravel将把所有已连接的玩家控制器(包括通过网络连接的玩家控制器)移至新的地图上。ClientTravel是在玩家控制器上使用的一种方法,也只能在玩家控制器上移动。
![](https://www.0419af.com/wp-content/uploads/2023/02/1675356056-46a309f1022ff0c.jpg)
在实践中,我们会通过添加“?listen”字符串到地图的URL结尾处这种方式,使用ServerTravel主持一场比赛。然后,我们使用ClientTravel功能,允许各客户端加入到这场比赛中。
如果你有一个能够公开访问的IP地址,那么一切就都不成问题了,但实际上你会在NAT之后被难题卡住。因此,如果你想让其中的任何一项起作用,就需要设置端口转发功能或使用类似于Hamachi这样免费且易于使用的虚拟VPN解决方案。
但我们不想让我们的玩家在IP地址方面浪费时间,更不用说虚拟VPN了。因此,我们需要一项可以为此做点什么的NAT遍历服务。
Steamworks SDK
幸运的是,Steam提供免费的NAT遍历服务,作为其Steamworks SDK中的一个组成部分。该SDK通过一个名为在线子系统(简称为OSS)的平台无关层,与虚幻引擎实现紧密集成。
Steamworks同样为我们开发多人游戏的第一步提供了解决方案:发现。它可以让我们为游戏制作广告,并显示服务器列表。以下是我们在课上创建的一个服务器列表UI,其中显示了一个名为“Donkey”的服务器。
授权服务器模型
现在发现和连接已经解决了,那么同步呢?
你以前可能就听说过服务器,但其实从未搞懂它的作用是什么。在虚幻引擎游戏中,它是最重要的一块拼图,因为我们有责任确保每个人同意并且没有人试图作弊。你可以将它想象成裁判!
在上述图表中,你可以看到服务器正在从其中一个客户端接收动作(用红色闪电标记),修改它的状态,然后将其发送到所有客户端。
当我们使用人物移动组件时,所有的同步操作都已经预先为我们写好。然而,如果我们想实现一种不同的运动,则需要了解幕后具体发生了些什么。
基本同步工具
Actor是基本同步单位。它们同时存在于客户端和服务器中,但其中服务器具有授权Role。也就是说,服务器上的Actor版本才是正确的。其他客户端则具有模拟代理Role,除非Actor由某一特定客户端控制。如果由本地控制,则Actor的Role为独立代理。这些Role存在的意义在于让Actor代码在不同的机器上呈现出不同的表现方式。
为了实现同步,重点在于独立代理客户端可将数据发送到服务器。然后,服务器可以更新其状态,并且最终需要将该状态向下推送到客户端。第一步由RPC调用实现,最后一步则由复制属性实现。有关这两者有太多话题可以讨论,所以我们就不在此一一说明了。但我们将在课程中针对它们进行全面的说明。
RPC调用即指我们在本地(客户端上)调用但在服务器上执行函数的方法。通过这种方式,我们可以更改服务器上的状态。由于这些调用受到使用验证函数的游戏规则密切监管,因此不会允许作弊行为。更多相关信息,请参见课程。
属性的复制相较于RPC而言更加简单。你只需添加“已复制”属性到UPROPERTY中,然后添加某个构建样板到GetLifetimeReplicatedProps虚拟方法中你可以从维基网页上查看该程序的详细说明。
这一操作会自动为你变一些戏法。现在,只要属性变更,客户端就会进行更新,与之匹配。然而,这不会立刻完成(毕竟,光在全世界范围内传播也是需要时间的)。因此,客户端需要在等待服务器更新的同时做些事情。
真正的难题刚刚开始……
如果你是一名玩家,那肯定非常讨厌延迟现象。如果你是一名游戏编程人员,那么处理延迟问题也将是一场噩梦。
在你与服务器之间进行的任何处理操作中,都会出现延迟。路由器需要处理和复制您周围的数据包,服务器自身需要进行计算,还有那讨厌的光速!所以实际上,你可能需要100ms(在糟糕的情况下)才能获取服务器响应。
从按下按键到看到行动结果需要等待100ms,是无法让人接受的。这会让游戏无法进行下去。鉴于此,目前有多种技术能够确保客户端中的游戏运行更加流畅,视图不会出现延迟。选择使用哪一种技术,取决于你想要获得什么样的游戏体验,因为所有这些技术各有利弊,需要你的权衡。
事实上,人物移动组件会实现上述其中一种技术,以确保FPS示例即使在高延迟下依然运行良好。然而,如果你想要一个自定义的移动类型,就需要了解自己该如何实现这些技术。
可惜这些技术不是一篇文章能够说明白的,但我们将在课程的最终部分中进行更加详细的说明。在这部分中,我们构建了一个卡丁车Actor,让它能够毫无延迟的四处移动。
拓展延伸
希望这篇教程能对你有所帮助。如果你有什么想法,请在评论中告诉我们。
显然,一篇博文中只能包含这些东西。但我们的Udemy课程将事无巨细地为你介绍所有内容。我们准备了长达20多个小时的视频内容,帮助你构建知识库,一步步地指导你开发出两款有趣的多人游戏。
在课程结束时,你将:
基本了解联网中存在的挑战(如延时、丢包、NAT遍历等); 了解虚幻多人游戏的架构特点; 能够通过本地网络连接游戏实例; 使用Steam插件和API在互联网上实现与玩家的连接; 在构建游戏时杜绝作弊; 通过使用RPC和属性复制实现两台机器之间的通信; 为自定义的移动系统构建延迟补偿系统; 了解如何读取引擎代码,弄清楚API的使用情况。
我们曾为超过100,000名新手培训过虚幻引擎的使用,并根据自身丰富的经验制定了此课程。我们也将自己的经验和热忱带到了这个全新的虚幻多人游戏开发课程中。希望你能够在未曾掌握网络理论知识的情况下使用虚幻引擎开发出简单的游戏。
虽然C++多人游戏开发课程没有严格的Epic内部审核制度,但目前注册该课程的学生人数已超过4000人,且评分达到了4.8/5。在该课程中,你可以学习到有关网络和多人游戏开发的基础知识。
现在你只需支付10美元就能享受本课程!