본문 바로가기

게임프로그래밍/실습2

[실습2] 48. 메타 어트리뷰트

1. 메타 어트리뷰트 만들기
 

데미지를 입힐때 게임플레이 이펙트가 직접적으로 데미지를 입히는 것이 아닌 메타 어트리뷰트를 통해 데미지를 설정할 것이다.

 

이렇게 하는 이유는 단순히 하나의 속성으로 데미지값을 정하는 것이 아니라 방어력이나 크리티컬 등의 다양한 요소가 있을 수 있고, 이것을 메타 어트리뷰트에서 처리할 것이기 때문이다.

 

메타 어트리뷰트는 서버에서만 존재하며 계산 결과를 클라이언트에게 알릴 것이다. 이제 이 메타 어트리뷰트를 만들어보자.

 

어트리뷰트 세트 클래스로 가서 변수를 선언하자.

UPROPERTY(BlueprintReadOnly, Category="Meta Attributes")
FGameplayAttributeData IncomingDamage;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, IncomingDamage)

 

아래 함수에서 데미지를 처리하고 있다.

void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)

 

기본적인 데미지 처리법은 아래와 같다.

if (Data.EvaluatedData.Attribute == GetIncomingDamageAttribute())
{
    const float LocalIncomingDamage = GetIncomingDamage();
    SetIncomingDamage(0.f);
    if (LocalIncomingDamage > 0.f)
    {
       const float NewHealth = GetHealth() - LocalIncomingDamage;
       SetHealth(FMath::Clamp(NewHealth, 0.f, GetMaxHealth()));

       const bool bFatal = NewHealth <= 0.f;
    }
}

 

이제 이것은 기본 계산이고 더 복잡한 계산식을 적용할 수도 있을 것이다.

 

이제 게임플레이 이펙트에서 체력을 빼는 것이 아니라 이 메타 데미지 값을 올리면 함수가 실행될 것이다.