언리얼 엔진/Gameplay Ability System - Udemy

Gameplay Ability System(GAS) - GAMEPLAYATTRIBUTE_REPNOTIFY

mane 2024. 2. 10. 00:48
728x90
반응형

인사말

안녕하세요, 이번 포스트에서는 Gameplay Ability System 을 통해서 캐릭터의 체력 및 마나를 관리하는 속성를 만들어보도록 하겠습니다.


GAMEPLAYATTRIBUTE_REPNOTIFY

GAMEPLAYATTRIBUTE_REPNOTIFYUnreal EngineGameplay 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 을 통해 디버깅 할 수 있습니다.


결과물

728x90
반응형