區別
雖然也是HitScane,但其可以對多個角色或者多個部位造成傷害
更改
首先是之前在FFramePackage結構體中,需要增添一個成員變數,用來表示該結構體中的BoxCollision屬於哪個敵人。
而之前使用的ConfirmHit返回的校驗擊中頭部和身體的結構體,需要為ShotGun建立類似的,其內有兩個TMap型別的成員變數
TMap<Character*, int> HeadHits;
TMap<Character*, int> BodyHits;
針對ShotGun的伺服器上檢測
由於ShotGun是可能攻擊的多個角色,具有多個HitLocation的,所以對於ShotGun的ServerRewind主函式,接受的引數也發生了變化
FShotGunServerSideRewindResult ShotGunServerSideRewind(const TArray<AXCharacter*>& HitCharacters, const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations, float HitTime)
FShotGunServerSideRewindResult這個結構體就是上面提到的ConfirmHit需要返回的結果。
而對於ShotGunServerSideRewind這個函式,處理是和普通的一樣的,對於HitCharacters,根據HitTime尋找關鍵幀的位置,然後進行儲存,最後再呼叫ConfirmHit函式對於該關鍵幀進行校驗
只不過由於是多個Character,所以需要儲存在一個陣列中,陣列每個索引位置接受一個HitCharacters在HitTime上的FramePackage
TArray<FFramePackage> FramesToCheck;
for (AXCharacter* HitCharacter : HitCharacters)
{
//獲取ShotGun的擊中檢測Box資訊
FramesToCheck.Add(GetFrameToCheck(HitCharacter, HitTime));
}
ShotGun ConfirmHit
還是因為多敵人的問題,所以引數發生了相應的變化
FShotGunServerSideRewindResult ShotGunConfirmHit(const TArray<FFramePackage>& FramePackages, const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations)
FramePackages
就是在ShotGunServerSideRewind函式
中獲得的儲存了每個角色在HitTime下的FramePackage
但是整體邏輯和ConfirmHit一致
- 首先定義一個FShotGunServerSideRewindResult結構體變數ShotGunResult,之後針對每個FramePackage中的檢測結果都可以存入到該結構體變數中
- 針對每個FramePackage裡面的HitCharacter儲存當前幀,用於檢測完成之後返回,然後回退到當前關鍵幀的FramePackage,關閉碰撞體之類的
- 開啟HeadBox碰撞,開始檢測,遍歷HitLocations陣列,根據每個HitLocation檢測是否有Hit,如果有,那麼將
ShotGunResult
裡面HeadHits
對應的Character命中次數+1 - 開啟身體的碰撞,開始檢測,也是遍歷HitLocations陣列,如果有Hit,那麼將
ShotGunResult
裡面BodyHits
對應的Character命中次數+1 - 進行Box的返回,開啟關閉碰撞等等,最後返回ShotGunResult
ShotGun 的 執行傷害邏輯
該函式就是和普通的一樣放在Weapon類中執行的
void ServerShotGunScoreRequest_Implementation(const TArray<AXCharacter*>& HitCharacters, const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations, float HitTime)
- 可以透過
ShotGunServerSideRewind
獲得所有攻擊的命中結果FShotGunServerSideRewindResult結構體變數Confirm
- 然後遍歷HitCharacters,透過
Confirm
中的兩個Map計算應當造成的傷害值,注意到這裡是沒有傳入武器的,因為目前是透過該元件類中獲取到的所屬成員,然後透過所屬成員獲取其持有的武器來獲得基礎傷害 - 最後利用ApplaDamage對HitCharater造成傷害