游戲能力預(yù)測概述(機(jī)器翻譯版)
高級別目標(biāo):
在GameplayAbility級別(實施能力)預(yù)測是透明的。說一個能力“Do X> Y-> Z”,我們會自動預(yù)測我們可以做的部分。
我們希望避免在能力本身中有諸如“如果權(quán)限:做X否則:X的預(yù)測版本”的邏輯。
在這一點(diǎn)上,并不是所有的案例都得到解決,但是我們有一個非常堅實的框架來處理客戶端預(yù)測。
當(dāng)我們說“客戶端預(yù)測”時,我們真的意味著客戶端預(yù)測游戲模擬狀態(tài)。事情仍然可以“完全是客戶端”,而不必在預(yù)測系統(tǒng)中工作。
例如,腳本完全是客戶端,不會與此系統(tǒng)交互。但是,當(dāng)他們施放法術(shù)時,預(yù)測法術(shù)力從100到90的客戶是“客戶端預(yù)測”。
我們目前預(yù)測的是什么?
活力激活
- 觸發(fā)事件
-GameplayEffect應(yīng)用程序:
-Attribute修改(EXCEPTIONS:執(zhí)行當(dāng)前不預(yù)測,只有屬性修飾符)
-GameplayTag修改
- 游戲提示事件(均來自預(yù)測游戲效果和自己)
-Montages
- 運(yùn)動(內(nèi)置于UE4 UCharacterMovement)
有些事情我們無法預(yù)測(我們大多數(shù)可能,但目前還沒有):
-GameplayEffect刪除
-GameplayEffect定期效果(點(diǎn)滴)
我們試圖解決的問題:
“我可以做嗎?”基本預(yù)測協(xié)議。
2.“撤消”當(dāng)預(yù)測失敗時如何撤消副作用。
3.“重做”如何避免重播本地預(yù)測的副作用,但也可從服務(wù)器復(fù)制。
4.“完整性”如何確定我們/真的/預(yù)測所有的副作用。
5.“依賴關(guān)系”如何管理依賴預(yù)測和預(yù)測事件鏈。
6.“覆蓋”如何預(yù)先覆蓋狀態(tài),否則由服務(wù)器復(fù)制/擁有。
實施細(xì)節(jié)
PredictionKey
該系統(tǒng)中的一個基本概念是預(yù)測鍵(FPredictionKey)。它自己的預(yù)測鍵只是在客戶端的中心位置生成的唯一ID。客戶端將其預(yù)測密鑰發(fā)送到服務(wù)器,
并與預(yù)測動作和副作用相關(guān)聯(lián)。服務(wù)器可以對預(yù)測密鑰進(jìn)行接受/拒絕來響應(yīng),并且還將服務(wù)器端創(chuàng)建的副作用與該預(yù)測密鑰相關(guān)聯(lián)。
(重要)FPredictionKey始終復(fù)制客戶端 - >服務(wù)器,但是當(dāng)復(fù)制服務(wù)器 - >客戶端時,它們僅首先將發(fā)送預(yù)測密鑰的客戶端復(fù)制到服務(wù)器。
這在FPredictionKey :: NetSerialize中發(fā)生。當(dāng)從客戶端發(fā)送的預(yù)測密鑰通過復(fù)制的屬性被復(fù)制時,所有其他客戶端將接收到無效(0)預(yù)測密鑰。
能力激活
能力激活是一流的預(yù)測行動。每當(dāng)客戶端預(yù)測性地激活能力時,他明確地要求服務(wù)器和服務(wù)器明確地做出響應(yīng)。一旦有了能力
預(yù)測性地激活,客戶端具有有效的“預(yù)測窗口”,其中預(yù)測性副作用可能發(fā)生,這些未明確地被“詢問”。 (例如,我們沒有明確提出“我可以減少法力,我可以嗎
把這個能力放在冷卻時間。這些行為被認(rèn)為是邏輯原子的,激活一個能力)。
AbilitySystemComponent提供了一組用于在客戶端和服務(wù)器之間進(jìn)行通信能力激活的功能:TryActivateAbility - > ServerTryActivateAbility - > ClientActivateAbility(Failed / Succeed)。
1.客戶端調(diào)用TryActivateAbility生成新的FPredictionKey并調(diào)用ServerTryActivateAbility。
2.客戶端繼續(xù)(在從服務(wù)器回來之前),并使用與能力的ActivationInfo關(guān)聯(lián)的生成的PredictionKey調(diào)用ActivateAbility。
在ActivatAbility調(diào)用之前/之前發(fā)生的任何副作用/生成的FPredictionKey與它們相關(guān)聯(lián)。
4.服務(wù)器決定ServerTryActivateAbility中是否發(fā)生了這種能力,調(diào)用ClientActivateAbility(Failed / Succeed),并將UAbilitySystemComponent :: ReplicatedPredictionKey設(shè)置為已發(fā)送的生成的密鑰。
5.如果客戶端接收到ClientAbilityFailed,則立即殺死該能力并回滾與預(yù)測密鑰相關(guān)聯(lián)的副作用。
5A。 “回滾”通過FPredictionKeyDelegates和FPredictionKey :: NewRejectedDelegate / NewCaughtUpDelegate / NewRejectOrCaughtUpDelegate完成。
在TryActivateAbility中注冊回調(diào):
//如果此PredictionKey被拒絕,我們將調(diào)用OnClientActivateAbilityFailed。
ThisPredictionKey.NewRejectedDelegate()。BindUObject(this,&UAbilitySystemComponent :: OnClientActivateAbilityFailed,Handle,ThisPredictionKey.Current);
在ClientActivateAbilityFailed_Implementation中調(diào)用回調(diào)函數(shù):
FPredictionKeyDe