1. 체력과 마나에 클램핑 적용하기
이펙트 액터가 존재하고 그 덕분에 체력이나 마나가 증가하고 감소한다. 하지만 현재 어떤 제한도 걸려있지 않아 그 값이 마이너스가 되게도 하고 최대 체력/마나를 뛰어 넘기도 한다.
이를 방지하려고 하는데 그러기 위해서 Pre Attribute Change 를 이용할 것이다.
어트리뷰트 세트 클래스로 가자.
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
해당 함수는 어트리뷰트가 변경되기 전 밸류의 값을 변환시키는 함수이다. 밸류의 값을 변환 시키는 것이 가능하기는 하지만 클램프 외에 다른 목적으로 사용하는 것은 권장하지 않고 있다. (말이 권장하지 않는 것이지 사실상 금지하는 것과 마찬가지이다.)
어트리뷰트를 매개변수로도 받으니 어트리뷰트를 비교하여 클램프를 적용할 어트리뷰트에만 클램프를 적용할 수 있다.
이 어트리뷰트는 엑세서 덕분에 손 쉽게 가져올 수가 있다.
void UAuraAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
Super::PreAttributeChange(Attribute, NewValue);
if (Attribute == GetHealthAttribute())
{
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxHealth());
}
if (Attribute == GetManaAttribute())
{
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxMana());
}
}
변경되는 어트리뷰트가 체력과 마나면 최대값과 최소값을 제한한다.
다만 이렇게 하면 한가지 문제점이 생긴다. 값이 변경되기는 하지만 본질적으로 어트리뷰트를 변환하는 것이 아니라 숫자만 변환하는 것이기 때문에 실제 어트리뷰트는 값이 올라가거나 내려간다는 문제점이 있다. 이 부분은 나중에 고치기로 하자.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 26. 게임 플레이 이펙트에 게임플레이 태그 적용하고 태그 출력하기 (0) | 2024.11.30 |
---|---|
[실습2] 25. PostGameplayEffectExecute() - 어트리뷰트 변경 후 호출되는 함수 (0) | 2024.11.30 |
[실습2] 23. C++에서 인피니트 게임플레이 이펙트 제거하기 (0) | 2024.11.30 |
[실습2] 22. 인스턴트 게임플레이 이펙트 (0) | 2024.11.29 |
[실습2] 21. 이펙트 액터 기능 구현하기 (0) | 2024.11.29 |