关于UE4多人局域网联机游戏中联网和回放的设置细节问题

背景

我们在游戏开发、仿真推演中可能会遇到这样的需求:

  1. 要搭建局域网,可以多人对战的。
  2. 要可以回放,能把大家玩耍的过程记录下来,重放给玩家们看,做复盘。

于是我们需要开发【联网】和【回放】功能。联网使用RPC方式,通过事件发送来实现。回放是将事件按时间顺序记录下来的方式,也从网络模块里抓信息存下来。
但这时我们可能会遇到问题。联网和回放都是用的网络模块,冲突了怎么解决?打印时报错了:“客户端漫游失败,待定网络游戏创建失败” 怎么解决?

问题描述:

  1. 创建UE4工程后,使用蓝图创建多人局域网蓝图,在多人局域网下测试,可以运行。
  2. 单独制作回放(重播)系统,可以运行。
  3. 但将多人局域网和回放系统放一起就无法同时存在。具体问题:在PIE模式下可以联网,可以回放。但Standalone模式无法联网,无法回放。在发布独立游戏过程中无报错。
  4. 经测试:能搜索到房间session但无法加入session。于是想到使用NetworkError和TravelError 对gameinstance检测(蓝图如下图)
    在这里插入图片描述
    测试结果:Network并没有报错,但得到TravelError的报错如下: 客户端漫游失败,待定网络游戏创建失败
    在这里插入图片描述

检查结果:

  1. 多人网络session蓝图,创建session、find session、join session 无问题
  2. 回放系统无问题
  3. 找了另外一个联网工程,代码对比排查后。发现问题很可能出在配置上。

找到了解决方法

打开UE4工程下的Config/DefaultEngine.ini文件,这里面有UE4联网的设置。允许UE4链接局域网、steam、还是不允许联网。
在这里插入图片描述

找到对应的中括号的位置并增加或修改如下代码。如果没有中括号的项,可以自己创建一个。
如果你跟我一样UE4工程体量很大,那么DefaultEngine.ini内的信息也会很多,我们找的时候需要点耐心,


[/Script/Engine.GameEngine]
#使用井号可注释
#局域网配置,有这条才能连局域网玩
NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")

#回放系统配置,但无法联网的游戏  也无法启用回放系统。 注意前面有个+,就是说在局域网基础上 追加 对回放的支持。
+NetDriverDefinitions=(DefName="DemoNetDriver",DriverClassName="/Script/Engine.DemoNetDriver",DriverClassNameFallback="/Script/Engine.DemoNetDriver")

#链接到Steam平台的配置,局域网用不上,就先注释掉
#+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

[/Script/OnlineSubsystemUtils.IpNetDriver]
#一堆Copy过来的代码,不太懂,就直接用了----------------------------
AllowPeerConnections=False
AllowPeerVoice=False
ConnectionTimeout=60.0
InitialConnectTimeout=60.0
RecentlyDisconnectedTrackingTime=120
TimeoutMultiplierForUnoptimizedBuilds=1
KeepAliveTime=0.2
MaxClientRate=100000
MaxInternetClientRate=100000
RelevantTimeout=5.0
SpawnPrioritySeconds=1.0
ServerTravelPause=4.0
NetServerMaxTickRate=30
MaxNetTickRate=120
NetConnectionClassName="/Script/OnlineSubsystemUtils.IpConnection"
MaxPortCountToTry=512
ResolutionConnectionTimeout=20.0
#一堆Copy过来的代码,不太懂,就直接用了----------------------------


[/Script/Engine.NetDriver]
#如果有控制、声音、Actor等需求。这里是从其他地方copy过来的,我眼下用不上,但也保留了
+ChannelDefinitions=(ChannelName=Control, ClassName=/Script/Engine.ControlChannel, StaticChannelIndex=0, bTickOnCreate=true, bServerOpen=false, bClientOpen=true, bInitialServer=false, bInitialClient=true)
+ChannelDefinitions=(ChannelName=Voice, ClassName=/Script/Engine.VoiceChannel, StaticChannelIndex=1, bTickOnCreate=true, bServerOpen=true, bClientOpen=true, bInitialServer=true, bInitialClient=true)
+ChannelDefinitions=(ChannelName=Actor, ClassName=/Script/Engine.ActorChannel, StaticChannelIndex=-1, bTickOnCreate=false, bServerOpen=true, bClientOpen=false, bInitialServer=false, bInitialClient=false)

[OnlineSubsystem]
#无法联网,经测试此种方法无法链接局域网。就好像一个网络开关一样。
#DefaultPlatformService=Null

#允许联网,经测试在断开网线后,此种方法可以组建局域网,并非链接到steam平台。
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480

[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName=OnlineSubsystemSteam.SteamNetConnection

[/Script/WindowsTargetPlatform.WindowsTargetSettings]
Compiler=VisualStudio2017

设置完成后,重启UE4引擎,再次以Standalone模式运行游戏,就可以既支持联网,也可以录制回放了。

重点1:

是 [/Script/Engine.GameEngine] 这个设置,由于我的游戏是局域网的,不需要链接steam平台。而且局域网支持录制回放,所以我用注释的方式关闭了OnlineSubsystemSteam.SteamNetDriver。

#局域网配置
NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")

#回放系统配置,但无法联网的游戏  也无法启用回放系统。
+NetDriverDefinitions=(DefName="DemoNetDriver",DriverClassName="/Script/Engine.DemoNetDriver",DriverClassNameFallback="/Script/Engine.DemoNetDriver")

#链接到Steam平台的配置
#+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
注意:GameNetDriver 和 DemoNetDriver 两个名字要分开,不能用一个替代,否则错误。
我测试时,一看都是一样的,那就合并了把,就把 DemoNetDriver 改成了 GameNetDriver ,结果报错了。

重点2:

把 DefaultPlatformService 设置成Null ,无法联局域网。设置成steam后,可以链接局域网。
在断开路由器跟互联网的链接后,使用DefaultPlatformService=Steam,路由器的局域网段内,可以顺利搭建局域网多人游戏。说明此处的steam并非Steam游戏平台。如下代码

[OnlineSubsystem]
#无法联网,经测试此种方法无法链接局域网。
#DefaultPlatformService=Null

#允许联网,经测试在断开网线后,此种方法可以组建局域网,并非链接到steam平台。
DefaultPlatformService=Steam

以上基于经验性探索,有错误请朋友们指正,希望能帮助到朋友们。

猜你喜欢

转载自blog.csdn.net/leelizc/article/details/129323077