UE4.22からUE4.23にしたらOnlineSubsystemOculusで接続できなかったので対応した


作成中のプロジェクトをUE4.22からUE4.23.1にアップデートしようとしたらOnlineSubsystemOculusで接続しようとすると接続できない現象が発生したので対応した。
ここでは対応の内容を記録する。

発生した現象

UE4.23.1にアップデートするとクライアントからJoinSessionすると処理は成功するがサーバー側に接続できない。

原因と対応結果

以下のバグが原因だった。
https://issues.unrealengine.com/issue/UE-82549

プロジェクトに取り込んでいたOnlineSubsystemOculusに上記リンク先に書いてある以下の修正を適用すると接続できるようになった。

Change line 186 in IpAddressOculus.h (ToString) from:
return OculusId.ToString();
to
return FString::Printf(TEXT("%s.oculus"), *OculusId.ToString());

現象の調査過程

ログの調査

  • 正常に接続できるUE4.22のログと比較するとサーバー側で以下のようなログが出ているのが原因っぽかった。
[2019.10.04-02.21.56:650][ 96]LogEngine: Changing dynamic resolution state.
[2019.10.04-02.22.14:924][735]LogHandshake: SendConnectChallenge. Timestamp: 28.507830, Cookie: 039125221129068025073170116200035043157184180036126099049244
[2019.10.04-02.22.14:952][735]LogPackageName: SearchForPackageOnDisk took   0.028s, but failed to resolve [Oculus ID].umap.
[2019.10.04-02.22.14:952][735]LogNet: Warning: There is no connection to: 0
[2019.10.04-02.22.14:952][735]LogNet: Warning: Server failed post-challenge connection from: [Oculus ID]
[2019.10.04-02.22.14:952][735]LogNet: Warning: There is no connection to: [Oculus ID]

PackageNameまわりのコード調査

エラーメッセージを出している
Engine/Source/Runtime/CoreUObject/Private/Misc/PackageName.cpp 
をよんでみたりするが[Oculus ID].umapというようなマップがないので原因がわからず。

VSからのデバッグによる調査

VisualStudioでプロセスにアタッチしてデバッグしてみようと、起動したウィンドウから切り替えるとエラーで落ちる現象が発生した。
エラーメッセージで調べてみるとこちらのバグがひっかかったのでコミット内容をエディタに適用してビルドするとエラーがでなくなった。

プロセスをアタッチしてデバッグしてみたところ。
PackageNameのコードが以下のように呼び出されていることがわかった。

>    Laplace-Win64-DebugGame.exe!FURL::FURL(FURL * Base, const wchar_t * TextURL, ETravelType Type) Line 144    C++
     Laplace-Win64-DebugGame.exe!UOculusNetDriver::LowLevelSend(TSharedPtr<FInternetAddr const ,0> Address, void * Data, int CountBits, FOutPacketTraits & Traits) Line 294    C++
...

少しコードも読んでみてOnlineSubsystemOculusのバグっぽいことを確認した。

バグの調査

issuesでOculusのキーワードを入れるとこちらのバグがひっかかった。
内容があてはまったので書いてある修正内容を適用してみる接続できるようになった。