虚幻4的网络功能
讀前說明
???????? 本人認(rèn)為Relicated應(yīng)該被叫做同步,所以接下來所有的同步都是Relicated的意思。當(dāng)然官方叫做復(fù)制(在編輯器中叫復(fù)制讓用戶比較好理解)。原因:因?yàn)橐姹举|(zhì)上的操作是“復(fù)制”,但是概念上還是應(yīng)該被叫做“同步”。“同步”不僅僅是復(fù)制,而且同步的概念更加寬泛(開發(fā)者會(huì)加網(wǎng)絡(luò)代碼,如果用的不是復(fù)制的方法)。
?
???????? 建議在看本視頻前先去看一下官方的網(wǎng)絡(luò)模塊教學(xué)視頻以及官方案例關(guān)卡的網(wǎng)絡(luò)關(guān)卡。這對(duì)學(xué)習(xí)網(wǎng)絡(luò)模塊有很大的幫助,如果英語不好的,可以去看三巫社區(qū)的網(wǎng)絡(luò)教程,這是個(gè)是對(duì)官方教程的中文解讀教程。(不過我不確定目前還有沒有)
?
???????? 要使用網(wǎng)絡(luò)功能,需要先在Cpp文件中添加#include "UnrealNetwork.h",當(dāng)然也可以加在主模塊的頭文件上,官方的ShootGame就是這么做的。
參看Source\ShooterGame\Public\ShooterGame.h
#include "Net/UnrealNetwork.h"
?
???????? 首先同步需要區(qū)分電腦是服務(wù)器端還是客戶端,在藍(lán)圖中使用函數(shù)
Switch Has Authority,Authority代表服務(wù)器端,Remote代表客戶端。
???????? 更多的內(nèi)容請(qǐng)看Wiki,這里講得更加全面。
https://wiki.unrealengine.com/Replication#Getting_An_Event_When_Your_Property_Is_Replicated
? ? ? ? ?官方案例:
???????? ShootGame、虛幻競技場
?
網(wǎng)絡(luò)通信分3種方式:
一、變量同步
二、事件函數(shù)同步
三、Actor同步
一、變量同步
1、在頭文件中定義變量并且設(shè)置同步標(biāo)志
變量同步方式分2種:Relicated與RepNotify。后者后生成一個(gè)更新事件(OnRep_?XX),當(dāng)變量改變時(shí)會(huì)執(zhí)行對(duì)應(yīng)的事件函數(shù)。
(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;
?
當(dāng)然你需要在之后聲明對(duì)應(yīng)的OnRep函數(shù),不過需要注意,要想這個(gè)函數(shù)生效,必須開啟網(wǎng)絡(luò)模式,即在虛幻編輯器中設(shè)置2個(gè)或2個(gè)以上的玩家,不然這個(gè)函數(shù)式不會(huì)運(yùn)行的。
https://docs.unrealengine.com/latest/CHN/Programming/UnrealArchitecture/Reference/Properties/Specifiers/ReplicatedUsing/index.html
Wiki上Rama的案例教學(xué)
https://wiki.unrealengine.com/Network_Replication,_Using_ReplicatedUsing_/_RepNotify_vars
2、在Cpp文件中實(shí)現(xiàn)GetLifetimeReplicatedProps
例如:
void APlayerCharacterCharacter::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const
{
???????? Super::GetLifetimeReplicatedProps(OutLifetimeProps);
???????? DOREPLIFETIME(APlayerCharacterCharacter,你的變量);
}
???????? DOREPLIFETIME的作用就是告訴引擎引擎這個(gè)變量需要同步。完成之后編譯,之后變量右上角就會(huì)多出2個(gè)球,代表這個(gè)變量會(huì)被同步。
?
現(xiàn)在你的變量已經(jīng)可以被同步。
這里需要說幾點(diǎn):
1、在角色類中bReplicates默認(rèn)是true,如果在Actor類中,則需要在構(gòu)造函數(shù)中加入bReplicates = true;。 2、條件屬性復(fù)制DOREPLIFETIME_CONDITION,也就是DOREPLIFETIME宏的高級(jí)版。https://docs.unrealengine.com/latest/CHN/Gameplay/Networking/Actors/Properties/Conditions/index.html
那什么時(shí)候需要使用呢?為什么要使用呢?
???????? 因?yàn)橛?jì)算機(jī)通信總是會(huì)有延遲,如果采用之前的同步方案,那人物移動(dòng)就會(huì)變成幻燈片,不停地瞬移。為了讓移動(dòng)更加平滑,引擎把在通信延遲期間模擬角色移動(dòng),所以在網(wǎng)絡(luò)不好的時(shí)候,我們經(jīng)常可以看到人物在不停往前走或者往前走一段路就停下。
???????? 這是一種引擎優(yōu)化方案。
轉(zhuǎn)載于:https://www.cnblogs.com/blueroses/p/5353846.html
總結(jié)
- 上一篇: [zz]Maya C++ API Pro
- 下一篇: 云锁多机版云中心使用测评