所有示例使用第三人称模板创建的项目并带有初始资源StarterContent
Actor同步即服务器识别并确认Actor是否设置为同步。如果Actor设置为同步,则服务器创建Actor并指示客户端创建和保留该Actor的复制版本。即服务器负责Actor的状态的改变,而客户端只是复制服务器上的Actor的状态。
在蓝图中同步Actor:
在同步Actor之前我们需要先知道Replicate的Actor和非Replicate的Actor之间的区别。
1、找到StarterContent/Blueprints下的Blueprint_Effect_Sparks并复制两个副本,分别命名为Fire_Rep和Fire_NoRep。
2、打开Fire_NoRep蓝图在Details面板中找到Net Load on Client属性并取消选中。取消选中这个选项后,在加载地图时这个Actor就不会再客户端上自动加载。
3、编译蓝图后打开Fire_Rep蓝图,在Details面板中选中Replicates选项。
4、编译之后将Fire_NoRep和Fire_Rep蓝图分别拖进关卡。
可以看到我将Fire_NoRep放在了台阶下面,将Fire_Rep放在台阶上面。
5、点击Play按钮旁边的向下箭头,将Number of Players选项改为2。设置为开启两个游戏窗口。
6、点击Play开始游戏。
可以看到在服务器上两个火焰特效都有显示,而客户端上值显示了Fire_Rep。因此可见Replicates的用处是将服务器上的Actor在客户端上复制一个副本。
接下来我们来动态创建同步的Actor:
1、将前面的两个特效蓝图从关卡中删掉然后从Modes视图中拖两个TargetPoint进关卡,并分别命名为No_Rep和Rep。
2、然后打开关卡蓝图,蓝图比较简单直接上图。
这段蓝图的作用是在游戏开始的时候在Rep点上创建一个Fire-Rep的Actor实例和在No_Rep点上创建创建一个Fire_NoRep的Actor实例;Switch Has Authority节点用来确定后面的逻辑是在服务器还是客户端上面执行,如果执行这段逻辑的是服务器,就会执行Authority后面的逻辑,如果是客户端,就会执行Remote后面的逻辑。这个节点也可以将主要判定逻辑写到Authority后面来防止客户端作弊。
3、点击play开始运行。
可以看到由于只有服务器执行了脚本,两个特效都显示在服务器上,而客户端上只显示了设置为同步的特效。当我们需要只在服务器或者客户端上生成某物时,Switch Has Authority节点非常实用。
4、回到关卡蓝图,将Switch Has Authority节点的Authority断开并连到Remote。
5、点击play运行。
可以看到因为脚本只在客户端上执行,所以客户端生成了全部特效,而服务器两个特效都没有生成。这种做法可以在实现比如收到攻击时显示特效这种并不需要服务器同步的效果时使用,可以有效地降低服务器的压力。