感谢Goulandis的文章,以下都是引用,以后自己有新的理解再补上https://blog.csdn.net/qq_39108291/article/details/119619482
UE5除了Nanite和Lumen两个比较大的技术改动之外,其他的部分实际上和UE4基本是一致的,所以虽说使用的是UE5来搭建Dedicated Server,实际操作和UE4没什么区别。
事实上UE5有提供两种服务器Dedicated Server和Listen Server,Dedicated Server是专用服务器,服务器和客户端是剥离开来的,而Listen Server则是类似局域网联机一般的,使用其中某一个客户端作为服务器的模式。
这里就谈到游戏网络同步的方式了,游戏网络同步的方式一般分为两种方式,P2P和C/S,P2P即每一台客户端之间互相直连,这种方式的同步极为复杂,对联机游戏来说基本已经淘汰了。C/S即经典的客户端/服务器模式,C/S又可细分为两种,一种是由一个客户端做主机,其他的客户端连接这个主机来进行网络同步,主机即拥有服务器功能也拥有客户端功能,这种模式多用于局域网联机,这种模式中每一个客户端都可以成为主机;一种是单独剥离服务器的功能,服务端只处理服务器相关的业务,所有的客户端都通过连接服务器来进行网络同步,同时客户端只留下客户端相关的业务,这就是网游中最常用的模式了。
首先我们需要明确一个认知—UE5的客户端代码和服务器代码是一体的,即两端的代码实际上是混杂在一起的。我们经常听到一种说法叫“前后端分离”,就是服务器干服务器的,客户端干客户端的,二者各为两个工程互不干扰,互相之间通过TCP或者UDP进行通信。而UE5的模式则是客户端和服务器不分离,同在一个工程之中,互相之间的代码使用宏来区分。两种方式各有各的好处。
我们这里要学习的ds服务器就是从这个一体的工程中单独剥离出来的一个服务器,为什么要剥离呢?如果不剥离,网络同步就变成了C/S模式的第一种情况了,但是大多数情况下服务器是不需要场景渲染,人物控制这些客户端业务的,剥离出来可以减轻服务器的运行压力。
Dedicated Server服务器简称ds服务器,是UE5用于解决FPS同步问题的一种专用服务器,UE5在UDP上自己做了一层根据游戏特点专门优化的网络协议(epic不愧是fps起家的😂),专门用于ds通信,ds服务器的一大特点就是客户端和服务器共享一份代码,因为高性能的同步需要各种客户端预测和回溯的方法,可以很好的解决同步延迟问题。但是UE5ds服务器承载量不高,不适合用于需要连接大量客户端的场景。
1.UNFUNCTION(Server, Reliable)
Server表示这个函数在客户端调用在服务器执行,和前面的Run on Server蓝图事件对应。
2.UFUNCTION(Client, Reliable)
Client表示这个函数在服务器调用在拥有这个Actor或UObject的客户端执行,函数执行的结果只在执行函数的客户端显示,不会同步到其他的客户端,和前面的Run on owning Client蓝图事件对应。
3.UFUNCTION(NetMulticast, Reliable)
NetMulticast表示这个函数在服务器调用并在服务器和所有与服务器连接并拥有这个Actor或Object的客户端上执行,和前面的Multicast蓝图事件对应。
4.Reliable
Server,Client和Multicast都需要搭配Reliable使用,否则编译无法通过,Reliable表示函数可以在网络空间进行复制,并会忽略带宽或网络错误而被确保送达,这保证了RPC的安全性。
5.RPC函数的实现
当一个函数被标识了Server,Client或Multicast宏后,函数的实现就和普通函数不一样了,函数实现的函数名和函数定义的函数名发生了变化,函数实现的函数名需要加一个_Implementation后缀,否则编译会报错。
6.重写GetLifetimeReplicatedProps函数
在UE5中,Actor是默认拥有网络同步能力的,但是UObject没有默认拥有网络同步,所以如果我们不重写GetLifetimeReplicatedProps函数,尽管成员函数标识了Server,Client或NetMulticast宏,UObject也依旧不具备网络同步的能力。
7.DOREPLIFETIME
除了DOREPLIFETIME宏UE5还有一个DOREPLIFETIME_CONDITION宏,二者的实机作用都是一样的,都是用于注册属性的条件复制的,当我们类里的变量
这里我在BeginPlay里加载了一个在前面第三节创建的Cube蓝图类,然后在SpawnCube函数中实现Cube的创建过程,这样Cube的创建过程就跑在了服务器上,而Cube勾选了Replicated,这样Cube的创建过程就可以通过服务器同步到所有的客户端中了。
然后我在SwitchTextRenderColor函数中修改Ball下面的UTextRenderComponent组件的字体颜色。由于SwitchTextRenderColor是在服务器调用在客户端执行,所以函数里面使用了GetWorld()->IsServer()来判断执行端是否是服务器,如果不做判断的话,函数会在服务器上调用但是却会在所有拥有UChatComponent组件的Ball上执行,而我要的效果是当服务器中Ball发射了超过20个Cube时只修改服务器上的Ball的Textrender的字体颜色,并把这个效果同步到其他客户端中对应的Ball上。
UE5 多人游戏示例
如果有客户端下线,那么它控制的Actor也立即消失。从其他客户端的表现上看,就是Actor的删除。
如果服务器关闭,客户端不会立即下线,但是无法调用RPC,在服务器上生成子弹,也就是在客户端的表现层面上无法开火。

7331

被折叠的 条评论
为什么被折叠?



