멀티플레이에서 중요한 게임 상태는 서버가 확정해야 한다.
HP, 마나, 쿨타임, 데미지, 스킬 성공 여부 같은 값은 클라이언트가 직접 결정하면 조작에 취약하다.
하지만 모든 처리를 서버 응답 이후에만 보여주면 입력 반응성이 크게 떨어진다.
클라이언트가 스킬 입력을 보낸 뒤 서버가 검증하고, 다시 클라이언트에게 이펙트와 애니메이션 재생을 알려주는 구조라면 왕복 지연 시간이 그대로 체감된다.
GAS는 서버 권위는 유지하면서도 클라이언트 화면에서는 즉시 반응하는 구조를 사용한다.
클라이언트 예측
void UMyGameplayAbility::ActivateAbility(...)
{
if (IsLocallyControlled())
{
PlayMontage(AttackAnim);
PlaySound(SwingSound);
ModifyAttribute(Mana, -50);
ServerRPC_TryActivateAbility();
}
}
클라이언트에서 처리한 마나 감소나 애니메이션 재생은 최종 결과가 아니라 예측된 결과다.
서버가 나중에 검증해서 승인하면 그대로 유지되고, 거부하면 되돌린다.
클라이언트 예측의 핵심은 다음과 같다.
클라이언트는 즉시 보여주고, 서버는 나중에 검증한다.
클라이언트의 예측은 사용자 체감을 위한 임시 처리이고, 최종 게임 상태는 서버가 결정한다.
서버 검증
서버는 클라이언트가 보낸 요청을 그대로 믿지 않는다.
스킬 사용 요청을 받으면 서버는 현재 마나, 쿨타임, 상태 이상, 거리, 타겟 유효성 등을 기준으로 실제로 가능한 요청인지 검사한다.
void UMyGameplayAbility::ServerRPC_TryActivateAbility_Implementation(...)
{
if (CanActivateAbility())
{
// 승인
ApplyRealCost();
ApplyCooldown();
NotifyPredictionSuccess();
}
else
{
// 거부
NotifyPredictionFailed();
}
}
서버가 승인하면 클라이언트의 예측 결과는 실제 결과가 된다.
서버가 거부하면 클라이언트는 자신이 미리 실행했던 예측 결과를 롤백해야 한다.
- 롤백 : 클라이언트 예측이 틀렸을 때, 예측으로 적용했던 처리를 되돌린다
클라이언트는 실패 통보를 받으면 예측으로 적용했던 GameplayEffect를 제거하고, 마나 값을 서버 값으로 보정하며, 실행 중이던 Ability를 취소한다.
// 개념적 흐름
PredictionFailed(Key);
RemovePredictedGameplayEffect(Key);
CorrectAttributeFromServer();
CancelAbility();
Prediction Key
Prediction Key는 클라이언트가 실행한 예측 작업들을 추적하기 위한 ID다.
클라이언트가 예측 실행을 시작하면 GAS는 Prediction Key를 발급한다.
이후 그 예측 윈도우 안에서 발생한 Cost 적용, 쿨타임 적용, 몽타주 재생, GameplayCue 실행, 이벤트 전송 같은 작업들은 같은 Key에 묶인다.
Prediction Key는 여러 예측 작업이 동시에 겹칠 때 특히 중요하다.
대시, 공격, 점프가 짧은 시간 안에 연속으로 실행되면 각각 다른 Key를 가진다. 서버는 각 Key에 대해 승인 또는 거부를 반환하고, 클라이언트는 어떤 예측을 유지하고 어떤 예측을 되돌릴지 판단한다.
FScopedPredictionWindow
FScopedPredictionWindow는 특정 범위 안의 작업들을 하나의 예측 Key에 묶는 장치다.
{
FScopedPredictionWindow PredictionWindow(ASC, true);
DoMagic1();
DoMagic2();
}
위 코드에서 DoMagic1, DoMagic2는 같은 Prediction Key에 묶인다.
서버가 이 Key를 승인하면 둘 다 유지되고, 거부하면 둘 다 롤백 대상이 된다.
새 Prediction Key를 생성
FScopedPredictionWindow(ASC, true);이미 존재하는 Prediction Key를 사용
FScopedPredictionWindow(ASC, ExistingKey);
NetExecutionPolicy
NetExecutionPolicy는 Ability가 어느 쪽에서 실행될지를 결정하는 정책.
enum class EGameplayAbilityNetExecutionPolicy : uint8
{
LocalOnly, // 로컬 실행
LocalPredicted, // 클라이언트에서 먼저 실행하고, 서버가 나중에 검증한다
ServerOnly, // 서버가 실행
ServerInitiated // 서버만 실행
};'Unreal Engine' 카테고리의 다른 글
| UE Angel Script Override (0) | 2026.08.06 |
|---|---|
| 게임 프로젝트에도 UE Public/Private 구조가 필요할까? (0) | 2026.08.04 |
| UE NetMode / NetConnection / NetDriver (0) | 2026.07.29 |
| MyaCat 정리 2 (0) | 2026.07.28 |
| MyaCat 정리 1 (0) | 2026.07.27 |