0. 개요
체력이 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()));
}
}
게임플레이 이펙트 발동 후의 데이터의 속성이 체력이면 다시 클램핑을 시도한다.
마나에 대해서도 동일하게 코드를 수정한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
6-2. 게임플레이 이펙트 - (4) 속성 값 초기화 (0) | 2024.09.04 |
---|---|
6-1. 데이터 테이블로 속성 값 초기화(Initialize), 1차 속성(Primary Attributes) (0) | 2024.09.04 |
5-13. 위젯 컨트롤러 코드 리펙토링 (0) | 2024.09.02 |
5-12. UI - (5) 위젯 블루프린트에 애니메이션 적용 (0) | 2024.09.02 |
5-11. UI - (4) 메세지 위젯 생성 (0) | 2024.09.02 |