所有示例使用第三人稱模板創(chuàng)建的項(xiàng)目并帶有初始資源StarterContent
Actor同步即服務(wù)器識(shí)別并確認(rèn)Actor是否設(shè)置為同步。如果Actor設(shè)置為同步,則服務(wù)器創(chuàng)建Actor并指示客戶端創(chuàng)建和保留該Actor的復(fù)制版本。即服務(wù)器負(fù)責(zé)Actor的狀態(tài)的改變,而客戶端只是復(fù)制服務(wù)器上的Actor的狀態(tài)。
在藍(lán)圖中同步Actor:
在同步Actor之前我們需要先知道Replicate的Actor和非Replicate的Actor之間的區(qū)別。
1、找到StarterContent/Blueprints下的Blueprint_Effect_Sparks并復(fù)制兩個(gè)副本,分別命名為Fire_Rep和Fire_NoRep。
2、打開(kāi)Fire_NoRep藍(lán)圖在Details面板中找到Net Load on Client屬性并取消選中。取消選中這個(gè)選項(xiàng)后,在加載地圖時(shí)這個(gè)Actor就不會(huì)再客戶端上自動(dòng)加載。
3、編譯藍(lán)圖后打開(kāi)Fire_Rep藍(lán)圖,在Details面板中選中Replicates選項(xiàng)。
4、編譯之后將Fire_NoRep和Fire_Rep藍(lán)圖分別拖進(jìn)關(guān)卡。
可以看到我將Fire_NoRep放在了臺(tái)階下面,將Fire_Rep放在臺(tái)階上面。
5、點(diǎn)擊Play按鈕旁邊的向下箭頭,將Number of Players選項(xiàng)改為2。設(shè)置為開(kāi)啟兩個(gè)游戲窗口。
6、點(diǎn)擊Play開(kāi)始游戲。
可以看到在服務(wù)器上兩個(gè)火焰特效都有顯示,而客戶端上值顯示了Fire_Rep。因此可見(jiàn)Replicates的用處是將服務(wù)器上的Actor在客戶端上復(fù)制一個(gè)副本。
接下來(lái)我們來(lái)動(dòng)態(tài)創(chuàng)建同步的Actor:
1、將前面的兩個(gè)特效藍(lán)圖從關(guān)卡中刪掉然后從Modes視圖中拖兩個(gè)TargetPoint進(jìn)關(guān)卡,并分別命名為No_Rep和Rep。
2、然后打開(kāi)關(guān)卡藍(lán)圖,藍(lán)圖比較簡(jiǎn)單直接上圖。
這段藍(lán)圖的作用是在游戲開(kāi)始的時(shí)候在Rep點(diǎn)上創(chuàng)建一個(gè)Fire-Rep的Actor實(shí)例和在No_Rep點(diǎn)上創(chuàng)建創(chuàng)建一個(gè)Fire_NoRep的Actor實(shí)例;Switch Has Authority節(jié)點(diǎn)用來(lái)確定后面的邏輯是在服務(wù)器還是客戶端上面執(zhí)行,如果執(zhí)行這段邏輯的是服務(wù)器,就會(huì)執(zhí)行Authority后面的邏輯,如果是客戶端,就會(huì)執(zhí)行Remote后面的邏輯。這個(gè)節(jié)點(diǎn)也可以將主要判定邏輯寫(xiě)到Authority后面來(lái)防止客戶端作弊。
3、點(diǎn)擊play開(kāi)始運(yùn)行。
可以看到由于只有服務(wù)器執(zhí)行了腳本,兩個(gè)特效都顯示在服務(wù)器上,而客戶端上只顯示了設(shè)置為同步的特效。當(dāng)我們需要只在服務(wù)器或者客戶端上生成某物時(shí),Switch Has Authority節(jié)點(diǎn)非常實(shí)用。
4、回到關(guān)卡藍(lán)圖,將Switch Has Authority節(jié)點(diǎn)的Authority斷開(kāi)并連到Remote。
5、點(diǎn)擊play運(yùn)行。
可以看到因?yàn)槟_本只在客戶端上執(zhí)行,所以客戶端生成了全部特效,而服務(wù)器兩個(gè)特效都沒(méi)有生成。這種做法可以在實(shí)現(xiàn)比如收到攻擊時(shí)顯示特效這種并不需要服務(wù)器同步的效果時(shí)使用,可以有效地降低服務(wù)器的壓力。