读前说明
本人认为Relicated应该被叫做同步,所以接下来所有的同步都是Relicated的意思。当然官方叫做复制(在编辑器中叫复制让用户比较好理解)。原因:因为引擎本质上的操作是“复制”,但是概念上还是应该被叫做“同步”。“同步”不仅仅是复制,而且同步的概念更加宽泛(开发者会加网络代码,如果用的不是复制的方法)。
建议在看本视频前先去看一下官方的网络模块教学视频以及官方案例关卡的网络关卡。这对学习网络模块有很大的帮助,如果英语不好的,可以去看三巫社区的网络教程,这是个是对官方教程的中文解读教程。(不过我不确定目前还有没有)
要使用网络功能,需要先在Cpp文件中添加#include "UnrealNetwork.h",当然也可以加在主模块的头文件上,官方的ShootGame就是这么做的。
参看SourceShooterGamePublicShooterGame.h
#include "Net/UnrealNetwork.h"
首先同步需要区分电脑是服务器端还是客户端,在蓝图中使用函数
Switch Has Authority,Authority代表服务器端,Remote代表客户端。
更多的内容请看Wiki,这里讲得更加全面。
https://wiki.unrealengine.com/Replication#Getting_An_Event_When_Your_Property_Is_Replicated
官方案例:
ShootGame、虚幻竞技场
网络通信分3种方式:
一、变量同步
二、事件函数同步
三、Actor同步
一、变量同步
1、在头文件中定义变量并且设置同步标志
变量同步方式分2种:Relicated与RepNotify。后者后生成一个更新事件(OnRep_ XX),当变量改变时会执行对应的事件函数。
(1)Relicated
UPROPERTY( Replicated,xxxxxx)
https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Reference/Properties/Specifiers/Replicated/index.html
其他操作与别的变量无异。
(2)RepNotify
UPROPERTY(Transient, ReplicatedUsing=OnRep_LastTakeHitInfo)
struct FTakeHitInfo LastTakeHitInfo;
当然你需要在之后声明对应的OnRep函数,不过需要注意,要想这个函数生效,必须开启网络模式,即在虚幻编辑器中设置2个或2个以上的玩家,不然这个函数式不会运行的。
https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Reference/Properties/Specifiers/ReplicatedUsing/index.html
Wiki上Rama的案例教学
https://wiki.unrealengine.com/Network_Replication,_Using_ReplicatedUsing_/_RepNotify_vars
2、在Cpp文件中实现GetLifetimeReplicatedProps
例如:
void APlayerCharacterCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(APlayerCharacterCharacter,你的变量);
}
DOREPLIFETIME的作用就是告诉引擎引擎这个变量需要同步。完成之后编译,之后变量右上角就会多出2个球,代表这个变量会被同步。
现在你的变量已经可以被同步。
这里需要说几点:
1、在角色类中bReplicates默认是true,如果在Actor类中,则需要在构造函数中加入bReplicates = true;。
2、条件属性复制DOREPLIFETIME_CONDITION,也就是DOREPLIFETIME宏的高级版。
https://docs.unrealengine.com/latest/CHN/Gameplay/Networking/Actors/Properties/Conditions/index.html
那什么时候需要使用呢?为什么要使用呢?
因为计算机通信总是会有延迟,如果采用之前的同步方案,那人物移动就会变成幻灯片,不停地瞬移。为了让移动更加平滑,引擎把在通信延迟期间模拟角色移动,所以在网络不好的时候,我们经常可以看到人物在不停往前走或者往前走一段路就停下。
这是一种引擎优化方案。