UE4/5 实现多人联机的经验教训
我花了半个多月给已经发售了的Koler突然加入多人联机功能,重置了几乎所有的Gameplay逻辑,踩了好多的坑。如果你也想给游戏加多人联机那最好也参考一下我的经验教训。
1. 尽可能早地去考虑多人联机相关功能的实现
只要有那么一点可能性那你就应该在项目一开始的时候就着手这些网络功能。这句话是写在ue网络文档一开始的地方的,可见有多重要,不然到头来重构的时候感觉像是在屎山蹦迪。
2. 和网络相关的实现绝对不要用TMap(Dictionary)这种数据结构
Koler里的属性系统大量地用了TMap,但是TMap不支持Replicate,我在论坛上翻的时候看见Tim Sweeney说他在1999年的时候就在考虑这个实现了,但是到现在都还没支持,可见有多坑了。就算是在RPC里你确实可以拿TMap当作参数传递,但是它有时候会被直接drop掉,服务器根本收不到client发的TMap。如果你真的需要用TMap,那我建议你自己写个结构体放两个数组,一个放key一个放value然后去replicate这个结构体(结构体里也不支持TMap的)。
3. 对于超大数组应该考虑用Fast Array Replication(FFastArraySerializer)
普通的TArray在很大的时候,如果其中某个元素改变了,那它可能是不会replicate的,这时候你该用FFastArraySerializer。
4. Steam Sockets 在ue4.26里 用户无法正常通过steam网络来加入一个session
我用steam sockets可以正常创建session,也可以被steam网络找到,但是加入不了(log里的原因记不清了反正没找到解决方法),最后是通过换成老的steam net driver才能正常加入session的(但是ping这个session时又有问题了,ping值9999。我在网上查了这个问题,epic那边反馈是steam那边的问题所以他们不管了)
5. 避免在多人联机游戏里用Load Level Instance
Server上调用Load Level Instance后Client是看不见的。就算你multicast给所有人,每个人的level instance里的actor也都不是replicate的,找不到同步的方法,解决方法无。