为了帮助测试多人游戏,编辑器提供了几个选项来运行项目的多个实例。
除了上面列出的选项之外,还有其他一些方法可以启动多人游戏。如果选择“启动单独服务器”并且“Play Net Mode”设置为“Play Standalone”,仍将创建一个专用服务器实例,但其他实例不会自动连接到它。然后,您可以将这些独立实例连接到服务器,例如使用命令“open 127.0.0.1:”或使用会话接口,这对于测试项目的连接流很有用。此外,如果“Play Net Mode”设置为“Play as Client”,则不需要为启动专用服务器实例启用“启动单独服务器”。
当在编辑器中使用不同的多人“Play Net Mode”选项时,这些实例会自动通过IP地址直接相互连接,相当于在客户端运行“open 127.0.0.1:17777”命令连接到服务器. 需要注意这一点,因为此连接过程不使用Session Interface。服务器不会创建在线多人会话,客户端也不会搜索和加入该会话。对于大多数游戏测试目的而言,这不会产生影响,但某些依赖会话界面的在线功能(例如语音聊天)将不可用。
这些不同模式之间存在细微差别,可能不会立即明显。例如,如果选择“在一个进程下运行”,所有客户端和服务器实例将共享与编辑器相同的滴答率。这与单独运行这些实例不同,例如在独立模式下,您可以使用 NetServerMaxTickRate 配置值控制服务器的滴答率。这可能会影响使用引擎滴答率的某些行为,例如计算单个网络更新的带宽限制。PIE 也不支持某些功能,例如服务器/客户端旅行。您的项目还需要在独立模式下作为编辑器之外的单独进程运行,以测试这些功能。最后,在单独的进程下运行时,一个进程将被视为 PIE 实例,而其他进程将被视为独立进程,与将所有实例作为 PIE 或独立运行相比,这可能会导致行为上的一些差异。例如,需要调用 UEditorEngine::NetworkRemapPath 来删除/添加通过网络发送的静态参与者路径上的 PIE 前缀。
在运行多个客户端和服务器实例时调试网络问题时,可能很难知道您连接到哪个实例。使用断点调试 PIE 实例时,将“UE4Editor-Engine!GPlayInEditorContextString”添加到您的监视窗口有助于确定您当前正在单步执行的实例。另一个值得关注的属性是 NetDriver 的 ServerConnection。在客户端上,这将包含对服务器的 NetConnection 的引用,而在服务器上,此值将为 Null,允许您在调试复制系统时快速检查您所在的实例。
另一个有用的技巧是检查演员的Role属性,方法是在手表中调用 GetLocalRole() 或直接在代码中调用它。该函数将返回实例对该actor的控制程度。如果您在复制的 actor 中调试问题,GetLocalRole() 将返回以下三项之一:
有关复制图的问题,您可以在 ReplicationGraphDebugging.cpp 中找到调试命令的完整列表。一些有用的命令包括“Net.RepGraph.PrintGraph”命令,它将打印复制图的全部内容。有关复制图中特定参与者的信息,“Net.RepGraph.PrintAllActorInfo”可用于打印路径名包含的参与者的全局和连接特定信息。此外,Replication Graph 还提供了通过“Net.RepGraph.SetDebugActor”命令将特定 Actor 设置为调试 Actor 的能力,允许您在调试图表时在特定 Actor 上设置断点。
重要提示: