본문 바로가기

언리얼 개발자

[Unreal] ASC TryActivateAbility flow in dedicated server

 이번 글에서는 GameplayAbility를 실행시켜주는 AbilitySystemComponent(ASC)의 TryAcitvateAbility 함수가 Dedicated Server에서 어떻게 동작하는지 정리해보려고 합니다.

 

UAbilitySystemComponent::TryActivateAbility()

 TryActivateAbility 함수는 여러 분기를 타게 되는데, 분기의 중심은 UGameplayAbilityNetExecutionPolicy입니다.

* LocalPredicted : "Part of this ability runs predictively on the local client if there is one"

LocalOnly : "This ability will only run on the client or server that has local control"

* ServerInitiated : "This ability is initiated by the server, but will also run on the local client if one exists"

ServerOnly : "This ability will only run on the server"

 

 Local이 붙은 옵션은 어빌리티 실행이 Local인 환경에서 되는 것이고, Server가 붙은 옵션은 어빌리티 실행이 Local이 아닌 환경에서 되는 것입니다. ASC에서는 'Local'를 AbilityActorInfo[FGameplayAbilityActorInfo] IsLocallyControlled()를 통해 판단합니다.

 

FGameplayAbilityActorInfo::IsLocallyControlled()

코드 상, NPC들의 경우 Net Authority를 가지고 있을 때 Local 이라고 판단합니다. 간단하게 보면 Dedicated Server 환경에서 PC는 Client 때, NPC는 Server일 때 Local이라고 판단됩니다.

 

아래의 표는 데디케이티드 서버 환경에서 옵션 별로 PC, NPC가 TryActivateAbility를 실행했을 때 방식입니다.

  PC NPC
LocalPredicted Client 실행 후 Server 실행 Server에서만 실행
LocalOnly  Client에서만 실행 Server에서만 실행
ServerInitiated  Server실행 후 Client 실행 Server에서만 실행
ServerOnly  Server에서만 실행 Server에서만 실행

 LocalPredicted 옵션에서 PC가 Server 측에서 GameplayAbility를 실행하더라도 TryActivateAbility 함수 내부에서 Client RPC를 통해 Client에서 실행하도록 처리합니다. 단, TryActivateAbility의 bAllowRemoteActivation 변수를 Default값 true인 채로 호출했을 때입니다. 만약 bAllowRemoteActivation 값을 false로 세팅했다면 TryActivateAbility는 Ability 실행 자체를 실패합니다.