0. 개요

 

4-8. 속성 세트 값 클램핑 - PreAttributeChange 함수, PostGameplayEffectExcute 함수

0. 개요이전 포스트에서 스택을 활용한 체력 회복 / 감소 액터를 만들었다.그러나 체력이 최대 체력보다 커지거나 0보다 작아지는 현상은 아직 수정하지 않았다.이번 포스트에서는 속성 세트의 P

crat.tistory.com

체력이 100일 때 Duration Effect인 체력 수정을 습득한 이후, 불 장판을 밟으면 체력이 줄어들지 않는 버그가 발생한다.

이전에 속성 값은 PreAttributeChange 함수에서 클램핑 했었는데, 버그가 발생한 부분을 확인하고 수정한다.

 

 

1. PreAttributeChange 함수 - AuraAttributeSet

(1) 정의

PreAttributeChange 함수는 속성 값이 변화하기 전에 호출되는 함수이다.

(언리얼 공식 문서에서는 해당 함수를 클램핑에만 사용하도록 권장)

 

 

(2) 버그가 발생한 이유

PreAttributeChange 함수는 게임플레이 이펙트가 해당 수정자를 사용하면 값을 다시 계산하기 때문에 적절하게 클램핑 되지 않는다.

즉 클램핑을 통해 수정자를 영구적으로 수정하는 것이 아닌 임시적으로 수정하는 것과 같다.

( 게임플레이 이펙트 발동 -> PreAttributeChange 호출, 클램핑에 따라 임시적으로 수정 후 적용 -> PostGameplayEffectExecute 호출)

 

따라서 PostGameplayEffectExecute 함수에서 한 번 더 클램핑을 실시한다.

 

 

2. PostGameplayEffectExecute 함수

게임플레이 이펙트가 발동된 이후에 호출되는 함수이다.

void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData & Data)
{
    // 게임플레이 이펙트 효과가 실행된 이후에 발동되는 함수
    Super::PostGameplayEffectExecute(Data);

    // 소스가 캐릭터가 아닐 경우에 컨트롤러를 얻지 못할 수 있음!!
    FEffectProperties Props;
    SetEffectProperties(Data, Props);

    if (Data.EvaluatedData.Attribute == GetHealthAttribute())
    {
        SetHealth(FMath::Clamp(GetHealth(), 0.f, GetMaxHealth()));
    }
}

게임플레이 이펙트 발동 후의 데이터의 속성이 체력이면 다시 클램핑을 시도한다.

마나에 대해서도 동일하게 코드를 수정한다.