Duration Policy가 Inifinite로 설정될 Gamplay Effect를 사용하기 위해서는
기존의 코드를 조금 변경해야 할 필요가 있습니다.
이전에는 Gameplay Effect를 사용하는 Actor에게서 Overlap 이벤트가 발생해도
Duration이 끝나거나 Instant라면 알아서 종료되기 때문에 큰 문제가 없었지만
Infinite인 경우 종료되지 않아 영구히 적용되 때문입니다.
따라서 코드를 수정하도록 하겠습니다.
1) Gameplay Effect를 발동하는 AuraEffectActor
UENUM(BlueprintType)
enum class EEffectApplicationPolicy : uint8
{
ApplyOnOverlap,
ApplyOnEndOverlap,
DoNotApply
};
UENUM(BlueprintType)
enum class EEffectRemovalPolicy : uint8
{
RemoveOnEndOverlap,
DoNotRemove
};
UCLASS()
class AURA_API AAuraEffectActor : public AActor
{
GENERATED_BODY()
public:
AAuraEffectActor();
protected:
virtual void BeginPlay() override;
/*
* Property Section
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
bool bDestroyOnEffectApplication = false;
/*
* Function Section
*/
UFUNCTION(BlueprintCallable)
void OnOverlap(AActor* TargetActor);
UFUNCTION(BlueprintCallable)
void OnEndOverlap(AActor* TargetActor);
/*
* Gameplay Effect Section
*/
UFUNCTION(BlueprintCallable)
void ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass);
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
TSubclassOf<UGameplayEffect> InstantGameplayEffectClass;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
EEffectApplicationPolicy InstantEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
TSubclassOf<UGameplayEffect> DurationGameplayEffectClass;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
EEffectApplicationPolicy DurationEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
TSubclassOf<UGameplayEffect> InfiniteGameplayEffectClass;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
EEffectApplicationPolicy InfiniteEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
EEffectRemovalPolicy InfiniteEffectRemovalPolicy = EEffectRemovalPolicy::RemoveOnEndOverlap;
};
가장 큰 변경점은 새로운 2개의 UENUM을 만들었다는 것입니다.
첫 번째 Enum인
UENUM(BlueprintType)
enum class EEffectApplicationPolicy : uint8
{
ApplyOnOverlap,
ApplyOnEndOverlap,
DoNotApply
};
EffectApplicationPolicy의 경우, GE를 적용하기 위한 정책을 결정합니다.
두번째 Enum인
UENUM(BlueprintType)
enum class EEffectRemovalPolicy : uint8
{
RemoveOnEndOverlap,
DoNotRemove
};
EffectRemovalPolicy의 경우 반대로, GE가 종료되기 위한 정책을 결정합니다.
따라서 GE의 적용/종료를 정의하기 위한 정책들을 기존의 프로퍼티로 존재하던
GE들에게도 적용해야 합니다.
그 절차를 다음과 같이 진행하였습니다.
UCLASS()
class AURA_API AAuraEffectActor : public AActor
{
GENERATED_BODY()
public:
AAuraEffectActor();
protected:
.
.
.
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
TSubclassOf<UGameplayEffect> InstantGameplayEffectClass;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
EEffectApplicationPolicy InstantEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
TSubclassOf<UGameplayEffect> DurationGameplayEffectClass;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
EEffectApplicationPolicy DurationEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
TSubclassOf<UGameplayEffect> InfiniteGameplayEffectClass;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
EEffectApplicationPolicy InfiniteEffectApplicationPolicy = EEffectApplicationPolicy::DoNotApply;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
EEffectRemovalPolicy InfiniteEffectRemovalPolicy = EEffectRemovalPolicy::RemoveOnEndOverlap;
};
한 프레임 동안 발동되는 Instant GE의 경우,
GE 적용 정책만 정의하였습니다.
지정한 기간동안만 발동되는 Duration GE의 경우도,
GE 적용 정책만 정의하였습니다.
마지막으로 영구히 발동되는 Infinite GE의 경우는 위와는 다르게
GE 적용 정책과 GE 종료 정책 둘다를 정의하였습니다.
그리고
UCLASS()
class AURA_API AAuraEffectActor : public AActor
{
GENERATED_BODY()
public:
AAuraEffectActor();
protected:
virtual void BeginPlay() override;
/*
* Property Section
*/
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
bool bDestroyOnEffectApplication = false;
/*
* Function Section
*/
UFUNCTION(BlueprintCallable)
void OnOverlap(AActor* TargetActor);
UFUNCTION(BlueprintCallable)
void OnEndOverlap(AActor* TargetActor);
.
.
.
};
프로퍼티 bDestroyOnEffectApplication을 추가하여 Effect의 발동 후 삭제 여부를 결정하겠습니다.
그리고 마지막으로 GE에 대해 적용/종료를 수행할
OnOverlap 함수와 OnEndOverlap 함수를 선언하고 정의는 차후 진행하겠습니다.