多人联机方面遇到的问题

为什么在独立进程游戏测试的时候可以正常读取steam好友列表在线状态,而当打包之后无法正确读取好友在线状态,但却可以正常发送邀请联机。并且在多台电脑中测试的时候,虽然显示成功加入游戏,但是实际上并没有成功加入游戏,反而回弹到主菜单上面了,并且房间的延迟是999,请问应该如何解决?

编辑器里独立进程能读到好友在线,打包后只能发邀请,加入后又被弹回主菜单,房间延迟显示 999。这三件事是连在一起的。

独立进程能读好友,是因为编辑器目录旁有 steam_appid.txt,Online Subsystem Steam 初始化成功了。打包后的 exe 如果旁边没有这个文件,或者 Target.cs 没有把 OnlineSubsystemSteam 打进包里,运行时会退回 Null 在线子系统。Steam 客户端自己的邀请还在,所以你仍然能发出邀请。游戏里读取好友在线状态走的是在线子系统,所以好友列表是空的或者全部离线。

打包前对一下这几处。DefaultEngine.ini 里 DefaultPlatformService 设为 Steam,OnlineSubsystemSteam 的 bEnabled 为 true,SteamDevAppId 和你后台的 AppId 一致。编辑器和打包包不要一个用 480,一个用正式 AppId。把 steam_appid.txt 放在打包 exe 的同一目录,文件里只有那一行 AppId。Target.cs 的 DynamicallyLoadedModuleNames 要包含 OnlineSubsystemSteam。Shipping 默认不会带上只在编辑器里动态加载的模块。

延迟 999,并且显示加入成功但回到主菜单,是客户端拿到了会话信息,但没有真正连上主机。会话列表里的 999 就是 ping 没有回来。编辑器里能连,是因为 Play 的网络模式会自动以 Listen Server 打开地图。打包后的 exe 不会做这件事。主机那一次 Open Level 必须带 ?listen,否则没有人在监听,客户端 Travel 失败就会被送回默认地图,也就是主菜单。

还有两件会让已经 listen 的主机也连不上。打包出来的 exe 第一次运行时,防火墙会拦它的 UDP,而编辑器进程是放行的。弹出提示时专用网络和公用网络都要允许。两边的 AppId 或网络驱动不一致时也一样。一边是 Steam Net Driver,一边是普通的 IpNetDriver,邀请能发出去,加入用的地址对不上,ping 就是 999。要进入的关卡还必须在打包设置的 Maps to Cook 里。地图没有 cook 时,客户端也会在加入后立刻退回菜单,看起来和连不上一样。

先只验证 listen。主机打包后执行 open 你的地图?listen,客户端用 open 主机IP:端口 直连,先不要走好友邀请。直连能进、邀请不能进,再查会话广播出去的地址。直连也不能进,就是 listen 或防火墙的问题,不是好友列表的问题。