在虚幻编辑器中测试网络选项
虚幻编辑器 包含可调整的设置,有助于测试多人游戏项目。这些选项包括设置 玩家数量(Number Of Players)、运行多个 运行窗口(Play windows) 和运行 专用服务器(Dedicated Server)。
要查看这些设置,请启动 编辑器(Editor) 并找到 工具栏(Toolbar),然后选择 运行(Play) 按钮旁边的 模式(Modes) 下拉按钮。
有关在编辑器中调整多人游戏设置的更多详细信息,请参阅测试多人游戏
多人游戏选项
启动专用服务器
你还可以使用其他方法启动多人游戏。按照以下步骤启动单独的专用服务器实例。
- 你可以从 模式(Modes) 下拉箭头中选择 高级设置(Advanced Settings),或者找到 编辑器偏好设置(Editor Preferences) > 关卡编辑器(Level Editor) > 运行(Play)> 多人游戏选项(Multiplayer Options)。
- 在 多人游戏选项(Multiplayer Options) 分段中,找到 启动单独的服务器(Launch Separate Server) 变量,然后单击相应的框以将其布尔值设为 true。
- 点击 运行网络模式(Play Net Mode) 变量旁边的下拉菜单,然后选择 单机游戏(Play Standalone)。
这样将创建新的服务器实例,但是,其他实例不会自动与它连接。
连接到独立服务器实例
你可以使用以下命令将 独立实例 连接到 服务器:
open 127.0.0.1:<PORT>
你也可以使用会话接口。这样会创建在服务器上运行的游戏实例,其他客户端可以发现并加入该实例。这对于测试项目的连接流很有用。
如果 运行网络模式(Play Net Mode) 变量设置为 作为客户端运行(Play as Client),则不需要启用 启动独立服务器(Launch Independent Server) 变量,因为启动专用服务器实例不需要它。
在编辑器的 网络模式选项(Net Mode options) 中使用 作为客户端运行(Play as Client) 或 作为侦听服务器运行(Play As Listen Server) 时,这些实例会自动通过IP地址直接相互连接。这相当于在 客户端 上运行 open 127.0.0.1:17777 命令,以便连接到 服务器。
此连接过程不 使用 会话接口,因此,服务器不会创建在线多人会话,客户端不会搜索并加入此会话。对于大多数Gameplay测试目的,这不会有很大区别。但是,某些依赖会话接口的在线功能(例如语音聊天)将不可用。
如果启用 在一个进程下运行(Run Under One Process) 变量旁边的方框,则所有客户端和服务器实例将作为编辑器共享相同的 函数更新率。
这与单独运行这些实例的行为不同。例如,在 独立模式 中,可使用 BaseEngine.ini 文件中的NetServerMaxTickRate配置值来控制服务器的函数更新率。
[/Script/OnlineSubsystemUtils.IpNetDriver]
NetServerMaxTickRate=30
这可能会影响某些使用函数更新率的行为,例如计算单个网络更新的带宽限制。
使用 在编辑器中运行(PIE) 时,服务器/客户端切换等功能存在限制。你的项目需要在独立模式下作为编辑器之外的单独进程运行,以便测试这些功能。
如果在单独的进程下运行实例,一个实例将被视为在编辑器中运行,而其他实例将被视为独立运行的实例。与统一运行实例相比,不论是统一在编辑器中运行还是统一独立运行,这种做法可能会导致不同的行为。例如,需要调用 UEditorEngine::NetworkRemapPath 函数,才能在通过网络发送路径的静态Actor上添加或删除PIE前缀。
调试多个客户端和服务器实例
运行多个客户端和服务器实例具有独特的挑战,尤其是不容易知道要附加到哪个实例。你可以使用断点来帮助调试PIE实例,从而缓解这些挑战。
在你的代码编辑器中,你可以将以下变量添加到你的 观察(Watch) 窗口。
| 观察变量 | 用途 |
|---|---|
UnrealEditor-Engine!GPlayInEditorContextString |
确定当前正在单步执行的实例。 |
NetDriver ServerConnection |
在客户端上,这将保存对服务器的 NetConnection 的引用。在服务器上,该值将为 Null,允许在调试复制系统时快速检查所在的实例。 |
此外,你可以调用观察中的GetLocalRole()函数或者直接在代码中调用它,从而检查Actor的角色属性。GetLocalRole函数将返回实例对该Actor的控制程度。如果你在复制Actor中调试问题,那么它将返回三个角色之一:
| 角色 | 描述 |
|---|---|
ROLE_Authority |
存在于服务器实例上的Actor。 |
ROLE_AutonomousProxy |
此Actor是该客户端实例上的本地玩家控制器拥有的角色或Pawn。 |
ROLE_SimulatedProxy |
存在于客户端实例上的Actor。 |
分析网络游戏
Networking Insights
你可以使用Networking Insights分析联网游戏。这是 Unreal Insights 分析工具的组件,可提供详细信息,帮助分析、调试和优化项目的网络流量。
Network Profiler
虚幻引擎还包括Network Profiler,这是一个传统工具,可提供项目网络流量的不同视图。虽然Network Profiler提供的信息不如Networking Insights提供的信息详细,但它仍然可以提供有关游戏带宽使用情况的简要概览以及单个Actor、属性或RPC的统计数据。
Gauntlet自动化框架
Gauntlet自动化框架支持启动多个会话,例如服务器和客户端,它可以成为测试和验证多人游戏项目的宝贵工具。
ShooterGame 项目中有一个使用Gauntlet的多人游戏自动化脚本示例实现方案。它包含用于驱动测试的ShooterGame自动化C#代码(位于 /Build/Scripts folder 文件夹)以及项目的原生测试控制器代码(位于 /Source/ShooterGame/Private 和 Public/Tests 目录)。
功能测试
UE具有通过关卡蓝图设置和运行功能测试的能力。 你的功能测试最初需要在项目的单个实例上运行。之后,你可以在多人游戏项目中运行这些测试。你可以在客户端实例、专用服务器或侦听服务器实例中启动包含测试的关卡。
当前不支持设置跨多个实例(例如客户端和服务器同时)运行的功能测试。所需功能 不会 运行的示例场景:如果服务器将复制属性设置为新值,则客户端会检查是否收到了这个新的复制值。