본문 바로가기

언리얼 개발자

[Unreal] NetExecutionPolicy in GameplayAbility

https://github.com/tranek/GASDocumentation#concepts-ga-net

 

 GameplayAbility에는 NetExecutionPolicy라는 옵션이 있습니다. 위 링크의 4.6.8 쪽에 잘 정리되어 있습니다.

이 옵션은 GameAbility를 네트워크 상에서 어느 쪽에서 호출할 지, 혹은 둘 다 호출된다면 순서를 어떻게 할 지를 정합니다.

 

현재 4가지의 옵션을 제공합니다.

Local Only : 소유한 클라이언트에서만 호출

Local Predicted : 소유한 클라이언트에서 먼저 어빌리티를 실행한 후에 서버에서 실행

Server Only : 서버에서만 호출

Server Initiated : 먼저 서버에서 호출된 후 소유한 클라이언트에서 호출

 

그 중 Local Predicted 는 상당히 매력적인 옵션입니다. 스킬 실행을 위한 코스트, 상태 검사 등은 주로 데디 서버에서 검증하게 됩니다. 하지만 데디 서버에서 먼저 스킬 로직을 실행한 후에 Client에서 실행하게 되면 패킷 지연 시간에 따라 스킬 몽타주의 root motion 이동 등이 끊길 수 있습니다. 이 문제를 해결하기 위한 것이 Local Predicted 옵션입니다.

 클라이언트에서 먼저 어빌리티를 실행하면서 서버에서 어빌리티 실행을 요청하고, 서버에서 검증하는 방식입니다. 서버에서 검증한 결과는 성공/실패 관계 없이 Client에 RPC를 통해 전달됩니다. 이에 따라 클라이언트에서는 서버에서 검증을 완료할 때까지 기다리는 것이 아니라 애니메이션, GameplayCue 등을 미리 실행할 수 있습니다.

 

Local Predicted Option - TryActivateAbility 함수 흐름도

 

 마지막 K2_EndAbility 함수를 제외한 모든 함수는 AbilitySystemComponent 내부 함수입니다. TryActivateAbility 함수만 호출해주면 내부적으로 서버 - 클라 간의 통신들이 모두 수행됩니다. 단, 클라이언트에서 서버의 어빌리티 실행의 성공을 예상하고 실행하는 것이기 때문에 서버에서 실패했을 때의 처리는 해주어야 합니다. 클라이언트에서 이미 실행해버린 몽타주, GameplayCue 등이 그 예입니다. 

 

NetExecutionPolicy 옵션의 효과를 극적으로 보고 싶다면 아래와 같은 환경으로 쉽게 볼 수 있습니다.

1. Play as Client 실행

2. 콘솔 명령어 "Net Pktlag=300" 실행

3. 몽타주를 실행시키는 게임 어빌리티를 Local Predicted와 Server Initiated 로 설정해서 플레이해보기