0. 개요
이전 포스트에서 타겟 데이터를 이용해 특정 데이터를 서버와 동기화하는 것을 구현했다.
서버와 동기화 중에 사용된 예측에 대해서 알아본다.
1. 예측(Prediction)
(1) 예측의 필요성
서버는 게임 상태에 대한 변경에 대한 권한을 가지고 있다.
클라이언트가 중요한 요소를 변경한다면 공격자가 게임의 데이터를 조작할 수 있게 된다.
이를 회피하기 위해, 클라이언트가 서버의 확인을 기다리는 것은 지연이 발생하게 된다.
이 두 가지 문제를 해결하기 위해 예측을 사용한다.
(2) 예측의 기본적인 작동방법
클라이언트가 움직임, 전투 등의 액션을 하면 서버에서 해당 액션이 유효한 작업인지 확인 후 잘못되었다면 효과를 되돌린다.
(3) GAS에서의 예측
if (Authority)
// X를 한다
else
// 예측된 버전의 Y를 한다
위와 같이 하드코딩된 예측을 이용하는 것이 아닌 어떤 상황에서든지 스스로 작동하는 예측을 원한다.
또한 모든 요소(발걸음 소리 등)가 아닌 상태 변화(마나 소모, 체력 증감, 데미지 발동 등)에 대한 부분에서만 작동하도록 원한다.
(3-1) GAS에서 예측하는 요소
- 게임플레이 어빌리티 활성화
- 이벤트 발동
- 게임플레이 이펙트 실행
-> 특성 수정자
-> 게임플레이 태그 수정
- 게임플레이 큐 이벤트
-> 예측된 게임플레이 어빌리티 내부의 큐 이벤트
-> 큐 이벤트 자체
- 몽타주
- 움직임
(3-2) GAS에서 예측하지 않는 요소
- 게임플레이 이펙트 제거
- 게임플레이 이펙트의 주기적 발생 효과들
2. 예측 키(Prediction Key)
고유(Unique) ID를 가지며 클라이언트에 내장되어 있다.
클라이언트가 특정 능력을 예측하여 실행했을 때 예측 키를 같이 전송하여 서버에서 검증한 후에 소모(Consume)한다.
- 일반적으로 '복제(Replication)'는 서버에서 클라이언트로의 동기화를 뜻하는 것이지만, 편의상 클라이언트에서 예측 키를 생성해 서버에서 예측 키를 소모하는 과정을 복제라고 부르기도 한다.
해당 키를 소유한 클라이언트가 아닌 해당 키를 소유할 수 없는 클라이언트(예측과 관련 없는 다른 클라이언트)는 Null 또는 ID가 0인 키를 받는다.
3. 예측 창(Prediction Window)
서버와의 통신에 의한 지연을 최소화하기 위해 서버의 확인을 기다리지 않고 미리 액션을 실행한다.
예측 키를 사용하여 예측과 결과가 일치하지 않으면 수정 또는 롤백한다.
4. 게임플레이 어빌리티 활성화에서 예측 동작 과정
(1) 클라이언트에서 TryActivateAbility 함수 호출
- FPredictionKey 구조체로 이루어진 능력 활성화 예측 키(Activation Prediction Key) 생성
(2) 클라이언트에서 ActivateAbility 함수 호출
- Activation Info(능력 활성화에 관련된 상태 정보) 생성
(3) 클라이언트에서 부수 효과(Side Effects ; 부작용) 발생
- 클라이언트가 예측을 실행함으로써 발생하는 의도치 않은(긍정적인 또는 부정적인) 효과 발생
(4) 서버에서 ServerTryActivateAbility 함수 호출
- 행동이 유효한지 확인
- 유효하면 ClientActivateAbilitySucceed 함수 호출
- 유효하지 않으면 ClientActivateAbilityFailed 함수 호출
(5) 클라이언트가 서버의 응답을 받음
- 유효하면 부수 효과는 유효 / 유효하지 않으면 어빌리티를 중단하고 부수 효과를 되돌림
(6) 서버에서 ReplicatedPredictionKey 복제
- 클라이언트에서 생성된 ScopedPredictionKey가 서버로 복제되어 ReplicatedPredictionKey가 됨
- 서버에서 어빌리티를 처리한 이후 결과를 클라이언트에게 전송
-> OnRep_PredictionKey 레플리케이션 실행
5. 게임플레이 이펙트에서 예측
게임플레이 이펙트는 어빌리티와 같이 명시적으로 요청되지 않으므로 부수 효과 중 하나이다.
(1) 클라이언트에게 유효한 예측 키가 있을 때만 적용됨
(2) 게임플레이 이펙트의 아래 요소들도 같이 예측됨
- 속성 수정
- 태그 수정
- 게임플레이 큐
(3) FActiveGameplayEffect가 생성될 때 예측 키(Active Gameplay Effect 키)를 서버에 저장함
(4) 서버에서는 동일한 키를 가짐. 이후에 클라이언트에게 복제함
- 서버와 클라이언트가 동일한 키를 가졌다면 모든 로직이 로컬에서 실행되었으므로 중복으로 실행되지 않게 함
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
9-7. 투사체 - (3) 적중 시 효과 재생, 몽타주에서 소리 재생 (0) | 2024.12.13 |
---|---|
9-6. 투사체 - (2) 투사체 정렬(Orienting), 모션 워핑(Motion Warping) (0) | 2024.12.11 |
9-4. 커스텀 어빌리티 태스크 - (2) 타겟 데이터(Target Data) 서버로 전송하기 (0) | 2024.12.09 |
9-3. 커스텀 어빌리티 태스크 - (1) 마우스 커서 아래의 HitResult 가져오기 (0) | 2024.12.09 |
9-2. 게임플레이 이벤트(Gameplay Events) (0) | 2024.12.09 |