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() 내부에서 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 모션을 출력하도록 처리했습니다.
'언리얼 개발자' 카테고리의 다른 글
[Unreal] Montage Loop & Jump Section (0) | 2023.09.10 |
---|---|
[Unreal] AbilityTriggers in GameplayAbility (2) | 2023.03.31 |
[Unreal] ASC TryActivateAbility flow in dedicated server (0) | 2023.03.23 |
[Unreal] NetExecutionPolicy in GameplayAbility (1) | 2023.03.10 |
[Unreal] Actor Dormancy & Network Profiling (0) | 2023.02.20 |