讀前說明
本人認為Relicated應該被叫做同步,所以接下來所有的同步都是Relicated的意思。當然官方叫做復制(在編輯器中叫復制讓用戶比較好理解)。原因:因為引擎本質上的操作是“復制”,但是概念上還是應該被叫做“同步”。“同步”不僅僅是復制,而且同步的概念更加寬泛(開發者會加網絡代碼,如果用的不是復制的方法)。
建議在看本視頻前先去看一下官方的網絡模塊教學視頻以及官方案例關卡的網絡關卡。這對學習網絡模塊有很大的幫助,如果英語不好的,可以去看三巫社區的網絡教程,這是個是對官方教程的中文解讀教程。(不過我不確定目前還有沒有)
要使用網絡功能,需要先在Cpp文件中添加#include "UnrealNetwork.h",當然也可以加在主模塊的頭文件上,官方的ShootGame就是這么做的。
參看Source\ShooterGame\Public\ShooterGame.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
那什么時候需要使用呢?為什么要使用呢?
因為計算機通信總是會有延遲,如果采用之前的同步方案,那人物移動就會變成幻燈片,不停地瞬移。為了讓移動更加平滑,引擎把在通信延遲期間模擬角色移動,所以在網絡不好的時候,我們經常可以看到人物在不停往前走或者往前走一段路就停下。
這是一種引擎優化方案。