Gameplay Ability System(GAS) - GAMEPLAYATTRIBUTE_REPNOTIFY
인사말
안녕하세요, 이번 포스트에서는 Gameplay Ability System 을 통해서 캐릭터의 체력 및 마나를 관리하는 속성를 만들어보도록 하겠습니다.
GAMEPLAYATTRIBUTE_REPNOTIFY
GAMEPLAYATTRIBUTE_REPNOTIFY
는 Unreal Engine
의 Gameplay Ability System (GAS)
에서 사용하는 기능 중 하나로, 게임 내에서 어트리뷰트(예: 체력, 마나, 공격력 등)의 변경 사항을 네트워크를 통해 다른 플레이어에게 동기화하고, 해당 변경 사항이 발생했을 때 특정 로직(예: UI 업데이트, 이펙트 발동 등)을 실행할 수 있도록 하는 데 사용됩니다. 이 기능은 주로 멀티플레이어 게임에서 플레이어 간의 어트리뷰트 동기화를 위해 중요하며, 효율적인 네트워크 통신과 게임의 동적 반응성을 높이는 데 기여합니다.
즉, 어트리뷰트는 게임 캐릭터의 다양한 상태(예: 체력, 마나, 공격력 등)를 나타내는 변수입니다. GAS를 사용하여 이러한 어트리뷰트의 변경을 감지하고, RepNotify
함수를 통해 변경 사항에 대응하는 로직을 실행할 수 있습니다.
Attribute Set(.h)
앞서 만들어둔 Aura Attribute Set
에 아래의 코드를 작성해주도록 합니다.ATTRIBUTE_ACCESSORS
매크로를 사용하여 Getter와 Setter를 자동으로 생성합니다.
동기화를 시키기 위해서 GetLifetimeReplicatedProps
함수도 선언해준다.
AuraAttributeSet.h
// // ATTRIBUTE_ACCESSORS 매크로를 사용하여 Getter와 Setter를 자동으로 생성합니다.
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
//
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_Health, Category = "Vital Attributes")
FGameplayAttributeData Health;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Health)
UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_MaxHealth, Category = "Vital Attributes")
FGameplayAttributeData MaxHealth;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, MaxHealth)
UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_Mana, Category = "Vital Attributes")
FGameplayAttributeData Mana;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Mana)
UPROPERTY(BlueprintReadOnly,ReplicatedUsing = OnRep_MaxMana, Category = "Vital Attributes")
FGameplayAttributeData MaxMana;
ATTRIBUTE_ACCESSORS(UAuraAttributeSet, MaxMana)
UFUNCTION()
void OnRep_Health(const FGameplayAttributeData& OldHealth) const;
UFUNCTION()
void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const;
UFUNCTION()
void OnRep_Mana(const FGameplayAttributeData& OldMana) const;
UFUNCTION()
void OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const;
ATTRIBUTE_ACCESSORS
를 선언해주면 Init{...} 함수를 사용할 수 있습니다.
Attribute Set(.cpp)
헤더에 위의 코드를 추가 후 cpp 에는 아래와 같이 코드를 작성합니다.
UAuraAttributeSet::UAuraAttributeSet()
{
// ATTRIBUTE_ACCESSOR 에 지정해주면 아래의 함수를 사용할 수 있다.
InitHealth(100.f);
InitMaxHealth(100.f);
InitMana(50.f);
InitMaxMana(50.f);
}
void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Health, COND_None, REPNOTIFY_Always);
DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, MaxHealth, COND_None, REPNOTIFY_Always);
}
void UAuraAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Health, OldHealth);
}
void UAuraAttributeSet::OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, MaxHealth, OldMaxHealth);
}
void UAuraAttributeSet::OnRep_Mana(const FGameplayAttributeData& OldMana) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Mana, OldMana);
}
void UAuraAttributeSet::OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, MaxMana, OldMaxMana);
}
이렇게 코드를 작성해주면 에디터에서 showdebug abilitysystem
을 통해 디버깅 할 수 있습니다.
결과물