언리얼 엔진 - 게임 프로젝트/GAS 프레임워크 RPG 프로젝트

GameplayEffect - 3) Infinite GameplayEffect와 GE 적용 / 제거

monstro 2025. 7. 18. 15:55
728x90
반응형

- 개요

영구히 적용되는 Infinite GE를 만들어본다

Infinite로 동작하는 GameplayEffect는 한번 적용되면 로직이 없는 이상 끝나지 않는다

따라서 GE를 적용하고 끝내는 로직을 추가하여 GE의 타입에 따른 다른 동작방식을 설정한다

 

- AuraEffectActor 클래스

 

두 개의 열거형 클래스를 추가한다

  • EffectApplicationPolicy 열거형 클래스 : GE를 적용하기 위한 정책을 의미
    • ApplyOnOverlap : 오버랩되면 GE를 적용
    • ApplyOnEndOverlap : 오버랩이 끝나면 GE를 적용
    • DoNotApply : GE를 적용하지 않음
  • EffectRemovalPolicy 열거형 클래스 : GE를 제거하기 위한 정책을 의미, Infinite만이 사용
    • RemoveOnEndOverlap : 오버랩이 끝나면 GE를 제거
    • DoNotRemove : GE를 제거하지 않음

 

 

2개의 함수 OnOverlap 함수OnEndOverlap 함수를 추가한다

두 함수 모두 블루 프린트에서 호출할 수 있도록 BlueprintCallable 속성을 추가한다

두 함수는 새롭게 추가한 GE의 적용 정책 / GE의 삭제 정책에 따라 다르게 로직을 수행한다

 

 

위와 같이 새롭게 추가한 멤버 변수들을 4개의 그룹으로 표시하였다

Instant / Duration GameplayEffect의 경우 ApplicationPolicy만을 설정한다

이와는 다르게 Infinite GameplayEffect는 ApplicationPolicyRemovalPolicy를 모두를 설정해야 한다

마지막으로 제거할 Infinite GameplayEffect를 저장할 TMap을 추가하였다

 

 

ApplyEffectToTarget 함수에 위와 같이 로직을 추가하였다

GESpecHandle에 접근하여 GE를 가져오GE로부터 Duration을 가져Infinite인지, 아닌지를 저장한다

 

만약 Infinite GameplayEffect이면서, RemovalPolicy가 설정되어 있다면

프로퍼티로 추가한 TMap에 해당 GameplyEffectTarget의 ASC를 저장한다

만약, Infinite GameplayEffect가 아니라면 해당 GE를 적용하는 EffectActor를 파괴한다

 

 

OnOverlap 함수는 위와 같이 구성하였다

ApplicationPolicy에 따라 적합한 GameplayEffect를 대상에게 적용한다

 

 

OnEndOverlap 함수는 위와 같이 구성하였다

ApplicationPolicy에 따라 적합한 GameplayEffect를 대상에게 적용한다

 

그리고 RemovalPolicy가 설정되어 있다

GE의 타겟으로부터 ASC를 가져오고 ActiveGameplayEffectHandle을 저장하는 빈 TArray를 생성한다

프로퍼티 ActiveEffectHandles를 순회하면서 ActiveGameplayEffectHandleASC의 튜플을 가져오는데,

타겟의 ASC튜플의 ASC가 동일하면 타겟에게서 해당 GameplayEffect를 제거하고 Stack 카운트를 1 깎는다

생성한 빈 TArray에 가져온 튜플의 Key인 ActiveGameplayEffectHandle을 저장한다

 

이후 생성한 TArray를 순회하면서

프로퍼티 TMap에서 순회중인 ActiveGameplayEffectHandle을 삭제한다

 

- 최종 실행 결과

 

 

728x90
반응형