UE4驗證網路版本的程式碼


在開發多人遊戲的時候總是會遇到client沒辦法連上server的情況。例如有人沒有更新,或是開錯目錄的執行檔等等。這篇文章稍微提一下UE4如何驗證不同版本的機制以及程式碼在哪邊處理這些事情,以及如何從log判斷是不是版本有問題。

EngineBaseTypes.h 有個ENetworkFailure::NetChecksumMismatch的enum 定義。

而PackageMapClient.cpp 有一些程式碼會檢查讀取物件的NetworkChecksum,如果判斷不對就會送出NetChecksumMismatch事件。

client會因為上面原因,造成spawn actor失敗,接著就會送NMT_ActorChannelFailure給server,此時server就會關掉對這個玩家的連線。送NMT_ActorChannelFailure的程式碼在 DataChannel.cpp

從client會看到的log:

LogNetPackageMap: Warning: GetObjectFromNetGUID: Network checksum mismatch. FullNetGUIDPath: [57]/Game/xxxxx.[55]xxxxx.[53]PersistentLevel.[131]xxxxx, 2365598466, 229775609

LogNet: Warning: UActorChannel::ProcessBunch: SerializeNewActor failed to find/spawn actor. Actor: None, Channel: 30

(LogNet可能預設不會輸出訊息,可能要透過修改參數或是用console command 輸入Log LogNet All來看)

server會看到的log:
Server connection received: ActorChannelFailure

所以server 或是client看到上述的訊息的話,就可以知道可能兩邊版本有問題,總之還是記得client跟server都要用相同的build比較不容易出這個狀況。


留言

這個網誌中的熱門文章

UE4 除錯技巧分享 (一)

UE4 GameplayAbilitySystem - GameplayEffect & GameplayCue 如何設定參數

UE4 GameplayAbilityTask介紹