본문 바로가기

언리얼 개발자

[Unreal] bRetriggerInstancedAbility in GameplayAbility

 UGameplayAbility 클래스에는 bRetriggerInstancedAbility 라는 bool 변수를 가지고 있습니다.

"if true, and trying to activate an already active instanced ability, end it and re-trigger it"

언리얼 주석에 따르면 true로 세팅했을 시 이미 실행되고 있는 생성된 어빌리티를 종료시킨 후 다시 실행시킨다는 것 같습니다.

 

 저 변수가 사용되는 곳은 UAbilitySystemComponent::InternalTryActivateAbility() 내부에 있습니다.

UAbilitySystemComponent::InternalTryActivateAbility() 함수 내부

위 사진은 UAbilitySystemComponent::InternalTryActivateAbility() 내부에서 bRetriggerInstancedAbility 변수를 사용하는 코드입니다.

 

1. GameplayAbility의 InstancingPolicy 값이 InstancedPerActor 인 경우

2. 현재 실행하려는 GameplayAbility가 이미 실행 중인 경우

3. bRetriggerInstancedAbility 값이 true인 경우

 

위 3가지 조건을 만족하면 EndAbility()를 호출하여 현재 실행 중인 어빌리티를 종료합니다. 어빌티를 정상적으로 종료하는 것이기 때문에 Cancel 값 또한 false로 전달됩니다. 이후에 다시 Ability를 실행시키는 코드가 동작하면서 Ability가 재실행됩니다.

 

 개인적으로는 Hit GameplayAbility를 실행할 때 위 옵션이 유용했습니다. 구현한 Hit GameplayAbility는 몽타주를 실행시키고 몽타주가 종료될 때 EndAbility()를 호출하는 어빌리티입니다. 기존 Hit 어빌리티가 실행되고 있는 중에 다시 타격이 들어온다면 다시 그에 맞는 Hit 모션을 보여주어야 했습니다. 하지만 bRetriggerInstancedAbility 변수가 false라면 어빌리티 실행 중 재시도가 불가능하므로, 기존 Hit 모션을 끝까지 봐야 합니다. 따라서 bRetriggerInstancedAbility를 true로 세팅한 후 기존 Hit 모션을 종료시키고 새로운 Hit 모션을 출력하도록 처리했습니다.