背景
- 需要搭建局域网游戏。还需要把多人协作玩耍的过程记录下来,可以回放。于是开发了联网和回放功能。但出了问题。报了错。
- “客户端漫游失败,待定网络游戏创建失败” 怎么解决?
问题
- 创建UE4工程后,使用蓝图创建多人局域网蓝图,多人局域网 可以运行
- 单独制作回放(重播)系统,可以运行。回放系统记录下什么时间发生了事件的机制就用的联网功能。
- 但将多人局域网和回放系统放一起就无法同时存在。具体问题:在PIE模式下可以联网,可以回放。但Standalone模式无法联网,无法回放。发布独立游戏无报错。
- 在排查网络连接失败,能搜索到房间session但无法加入session的过程中,使用NetworkError和TravelError 对gameinstance检测(蓝图如下图)
Network并没有报错,但得到TravelError的报错如下: 客户端漫游失败,待定网络游戏创建失败。
检查:
- 多人网络session蓝图,创建session、find session、join session 无问题
- 回放系统无问题
- 经两个多人网络游戏的代码对比排查。发现问题可能出在配置上。
解决
打开UE4工程下的Config/DefaultEngine.ini文件,这里面有UE4联网的设置。允许UE4链接局域网、steam、还是不允许联网。
找到对应的中括号的位置并增加或修改如下代码。如果没有中括号的项,可以自己创建一个。
[/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
[/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 起一个名字,也错误。
重点2:
把 DefaultPlatformService 设置成Null ,无法联局域网。设置成steam后,可以链接局域网。
在断开路由器跟互联网的链接后,使用DefaultPlatformService=Steam,路由器的局域网段内,可以顺利搭建多人游戏。如下代码
[OnlineSubsystem]
#无法联网,经测试此种方法无法链接局域网。
#DefaultPlatformService=Null
#允许联网,经测试在断开网线后,此种方法可以组建局域网,并非链接到steam平台。
DefaultPlatformService=Steam