UE4/5 實現(xiàn)多人聯(lián)機的經(jīng)驗教訓
我花了半個多月給已經(jīng)發(fā)售了的Koler突然加入多人聯(lián)機功能,重置了幾乎所有的Gameplay邏輯,踩了好多的坑。如果你也想給游戲加多人聯(lián)機那最好也參考一下我的經(jīng)驗教訓。
1. 盡可能早地去考慮多人聯(lián)機相關功能的實現(xiàn)
只要有那么一點可能性那你就應該在項目一開始的時候就著手這些網(wǎng)絡功能。這句話是寫在ue網(wǎng)絡文檔一開始的地方的,可見有多重要,不然到頭來重構的時候感覺像是在屎山蹦迪。
2. 和網(wǎng)絡相關的實現(xiàn)絕對不要用TMap(Dictionary)這種數(shù)據(jù)結構
Koler里的屬性系統(tǒng)大量地用了TMap,但是TMap不支持Replicate,我在論壇上翻的時候看見Tim Sweeney說他在1999年的時候就在考慮這個實現(xiàn)了,但是到現(xiàn)在都還沒支持,可見有多坑了。就算是在RPC里你確實可以拿TMap當作參數(shù)傳遞,但是它有時候會被直接drop掉,服務器根本收不到client發(fā)的TMap。如果你真的需要用TMap,那我建議你自己寫個結構體放兩個數(shù)組,一個放key一個放value然后去replicate這個結構體(結構體里也不支持TMap的)。
3. 對于超大數(shù)組應該考慮用Fast Array Replication(FFastArraySerializer)
普通的TArray在很大的時候,如果其中某個元素改變了,那它可能是不會replicate的,這時候你該用FFastArraySerializer。
4. Steam Sockets 在ue4.26里 用戶無法正常通過steam網(wǎng)絡來加入一個session
我用steam sockets可以正常創(chuàng)建session,也可以被steam網(wǎng)絡找到,但是加入不了(log里的原因記不清了反正沒找到解決方法),最后是通過換成老的steam net driver才能正常加入session的(但是ping這個session時又有問題了,ping值9999。我在網(wǎng)上查了這個問題,epic那邊反饋是steam那邊的問題所以他們不管了)
5. 避免在多人聯(lián)機游戲里用Load Level Instance
Server上調(diào)用Load Level Instance后Client是看不見的。就算你multicast給所有人,每個人的level instance里的actor也都不是replicate的,找不到同步的方法,解決方法無。