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比較不容易出這個狀況。
留言
張貼留言