https://github.com/tranek/GASDocumentation?tab=readme-ov-file#concepts-p
GitHub - tranek/GASDocumentation: My understanding of Unreal Engine 5's GameplayAbilitySystem plugin with a simple multiplayer s
My understanding of Unreal Engine 5's GameplayAbilitySystem plugin with a simple multiplayer sample project. - tranek/GASDocumentation
github.com
Definition
- GAS는 Client 쪽에 Prediction을 기본적으로 제공한다.
- 하지만 모두 다 Predict 되는 것은 아니다.
- Client에서 Predict 된다는 의미는 Server에서 Gameplay Ability 활성화나 Gameplay Effect 등록에 대한
허가를 기다릴 필요가 없다는 것을 의미한다. - 이는 작업을 수행할 권한을 부여해준 Server와 Gameplay Effect가 적용 될 Target을 Predict 하는 것이다.
- Server는 Client가 활동하고 나서 네트워크 지연 시간이 지난 후 GameplayAbility를 실행한 후,
Client에 Predict로 시행한 동작이 맞는지 틀린지 답해준다.- 만약 Client가 틀렸다면, Client에서 잘못 Predict 한 것을 Server의 결과로 복구한다.
- GAS에서의 Predict 관련된 코드들은 GameplayPrediction.h 파일에 있다.
- Epic의 Predict에 대한 철학은 "해도 될 것 같은 것"에 사용하는 것이다.
- 예를 들어 Paragon이나 Fortnite는 Damage를 Predict 하지 않는다.
- 대부분 ExecutionCalculations를 통해 Predict 할 수 없는 Damage를 처리한다.
... we are also not all in on a "predict everything: seamlessly and automatically" solution. We still feel player prediction is best kept to a minimum (meaning: predict the minimum amount of stuff you can get away with).
- Dave Ratti from Epic's comment from the new Network Prediction Plugin
Predict 가능한 것
- Ability Activation
- Triggered Events
- GameplayEffect Application
- Attribute Modification(Not Executions, only Attribute Modification)
- GameplayTag Modification
- Gameplay Cue Events
- Montages
- Movement(in UCharacterMovement)
Predict 불가능한 것
- GameplayEffect Removal
- GameplayEffect periodic Effect
추가 설명
- GameplayEffect 등록은 Predict 할 수 있지만, 제거는 Predict 할 수 없다.
- 이 제약을 피하는 한가지 방법은 제거 대신 Inverse Effect를 Predict하는 것이다.
- GameplayEffect 제거를 Predict 할 수 없기 때문에, 우리는 GameplayEffect Cooldown을 Predict 할 수 없다.
- 심지어 이건 Inverse도 없다.
- Server에서 Replicate 된 Cooldown GE는 Client에 존재 할 것이고
이를 제거하려는 모든 시도는 Server에 의해 거부될 것이다. - 이는 지연시간이 긴 유저가 서버로부터 Cooldown을 받는데 걸리는 시간이 길어 더 불리하다는 얘기이다.
- Fortnite는 이를 피하기 위해 Cooldown GE 대신 Custom Bookkeeping을 사용하고 있다.
- Instant GE를 자신에게 사용할 때에는 문제 없지만, 타인에게 사용할 때에는 값이 잠깐 튈 수 있다.
- Instant GE를 Predict 하는 것은 Infinite GE처럼 취급되어 복구가 될 수 있다.
- 만약 Server의 GE가 적용되면, 아주 잠깐동안 동시에 2개의 GE가 존재하여 Modifier가 2번 적용될 수 있다.
- 이는 곧 정상화가 되겠지만, 일부 유저들은 이상현상을 감지할 수 있다.
PredictionKey
- GA의 Prediction은 Client가 Gameplay Ability를 활성화 할 때 생성되는 Integer Identifier를 기반으로 동작한다.
- Gameplay Ability가 활성화 될 때 Prediction Key가 생성된다.
- 이를 Activation Prediction Key라 지칭한다.
- Client는 이 Key를 CallServerTryActivateAbility() 함수를 통해 Server에 전달한다.
- Client는 이 Key가 Valid한 동안 등록된 모든 Gameplay Effect에 추가한다.
- Client의 Prediction Key가 Scope를 벗어난다.
- 같은 Gameplay Ability에 Predict 한 Effect는 새 Scoped Prediction Window가 필요하다.
- Serverrk Prediction Key를 Client로부터 전달 받는다.
- Server가 Prediction Key를 등록된 모든 Gameplay Effect에 전달한다.
- Server가 Prediction Key를 Client로 다시 Replicate 한다.
- Client는 GE를 등록하는데 사용한 Prediction Key와 함께 GE를 Replicate 받는다.
- 만약 Client에서 등록한 GE 중 Replicate 받은 GE와 동일한 것이 있다면, Predict가 성공한 것이다.
- Client가 Predict한 GE를 제거하기 전까지 한 Target에 대해 일시적으로 2개의 GE가 존재하게 된다.
- Client가 Server로부터 Prediction Key를 받는다.
- 이것은 Replicated Prediction Key라 부른다.
- 이 Prediction Key는 이제 Stale 상태로 둔다.
- Client는 Stale 상태의 Replicated Prediction Key을 이용해 모든 GE를 지운다.
- Server로부터 Replicate 받은 GE는 유지가 될 것이다.
- Client가 생성했지만 Server로부터 Replicated Prediction Key를 받지 못한 GE는 모두 Predict 실패 처리된다.
- Gameplay Ability가 활성화 될 때 Prediction Key가 생성된다.
- Prediction Key는 GameAbility가 Activation Prediction Key로 인해 활성화 되고 나서
Window라는 Atomic Group 명령이 수행되는 동안 Valid를 보장 받는다.- 단순하게 한 Frame동안 Valid를 보장 받는다 생각하면 된다.
- 새로운 Scoped Prediction Window를 생성하는 Synch Point를 가지고 있지 않다면
예정되어 있는 Ability Task의 모든 Callback은 Valid한 Prediction Key를 가질 수 없다.
Creating New Prediction Windows in Ability
- Ability Task에서 발생한 Callback에 대해 더 많은 Predict를 하기 위해,
새 Scoped Prediction Key를 이용해 새 Scoped Prediction Window를 만들 필요가 있다.- 이는 Client와 Server 사이의 Synch Point로 여겨지기도 한다.
- Input과 같은 일부 Ability Task에는 새 Scoped Prediction Window를 생성하는 기능이 내장되어 있다.
- 이는 Ability Task의 Callback의 단위 코드는 유효한 Scoped Prediction Key를 가지고 있다는 뜻이다.
- 만약 Ability Task 이후의 행동을 Predict 한다면,
WaitDelay와 같이 Scoped Prediction Window를 만드는 코드가 없을 것이다.- 때문에 OnlyServerWait 옵션과 함께 AbilityTask관련하여 WaitNetSync을 사용해야만 한다.
- Client가 OnlyServerWait 옵션인 채로 WaitNetSync를 호출하면 다음 동작을 시행한다.
- Gameplay Ability의 Activation Prediction Key를 기반으로 한 새 Scoped Prediction Key를 생성
- 새 Scoped Prediction Key를 Server에 RPC로 전달하고
- 등록된 GE에 새 Scoped Prediction Key 추가
- Server가 OnlyServerWait 옵션인채로 WaitNetSync를 호출하면 다음 동작을 시행한다.
- 작업하기 전 Client로부터 새 Scoped Prediction Key를 받을 때까지 대기
- 이 Scoped Prediction Key는 GE에 등록된 Activation Prediction Keys와 일치하고,
Client에 Stale 한 채로 Replicate 된다. - Scoped Prediction Key는 Scope를 벗어나기 전까지 유효하다.
- 이는 Scoped Prediction Window는 닫혀 있다는 것이다.
- 그렇기에 미루어지지 않는 Atomic 연산만이 새 Scoped Prediction Key를 사용할 수 있다.
- WaitNetSync를 사용하면, Server의 Gameplay Ability가 Client로부터 패킷을 받을 때까지 대기상태에 빠질 수 있다.
- 이는 해커에게 취약점을 제공할 수 있다.
Predictively Spawning Actor
- Client에서 Actor Spawn을 Predict 하는 것은 좀 더 복잡한 이슈이다.
- 적어도 GAS는 이러한 기능을 제공하지는 않는다.
- 중요한건 Replicate 되는 Actor을 Client와 Server 양쪽에 모드 Spawn 해야 한다는 것이다.
- 만약 Actor가 장식이거나 Gameplay 목적이 전혀 없다면, IsNetRelavantFor() 함수를 Override 하여
Server가 소유한 Client에 Replicate하지 않도록 하는 것도 방법이다.- Owner Client는 Local 상으로 Spawn을 하고, Server나 다른 Client는 Spawn을 하지 않는다.
더보기
bool APAReplicatedActorExceptOwner::IsNetRelevantFor(const AActor * RealViewer, const AActor * ViewTarget, const FVector & SrcLocation) const
{
return !IsOwnedBy(ViewTarget);
}
- 만약 Projectile처럼 Gameplay에 영향을 주는 Actor인 경우, 좀 더 복잡한 추가 작업이 필요하다.
- Unreal Tournament에서는 Client에 Dummy Projectile을 Spawn하고
Server의 Replicated Projecile와 Synch up을 하여 Actor Spawn Predict를 수행한다.
- Unreal Tournament에서는 Client에 Dummy Projectile을 Spawn하고
Future of Prediction in GAS
- GameplayPrediction.h는 차후에 다음 항목에 대한 기능을 제공할 예정이라 밝혔다.
- GameplayEffect Removal
- Periodic Gameplay Effect
- 또한 Dave Ratti는 Cooldown Prediction에서의 Latency로 인한 불균형 문제 수정에 관심을 보이기도 했다.
- Epic의 새 Network Prediction Plugin은 예전 CharacterMovementComponent와 같이
GAS와 상호운영이 될 것으로 예상된다.
Network Prediction Plugin
Network Prediction | Unreal Engine 5.4 Documentation | Epic Developer Community
dev.epicgames.com
- Epic은 CharacterMovementComponent를 새로운 Network Prediction Plugin으로 대체하는 작업을 시작했다.
- 이 Plugin은 아직 매우 초창기이지만 Unreal Engine Github에서 쉽게 접근할 수 있다.
- 그럼에도 도입 시기를 논하기에는 매우 이른 감이 없지않아 있다.
'UE5 > GAS' 카테고리의 다른 글
[GAS] Gameplay Cue (0) | 2024.05.21 |
---|---|
[GAS] Gameplay Ability (0) | 2024.05.17 |
[GAS] Ability Task (0) | 2024.05.16 |
[GAS] Gameplay Effect (0) | 2024.05.15 |
[GAS] Attribute Set (1) | 2024.05.14 |