
이번 글에서는 Unreal Engine의 Gameplay Ability System 중 AttributeSet을 중심으로, 변수와 속성들이 네트워크를 통해 어떻게 동기화되고 조정되는지, 이를 위한 조건과 알림 메커니즘에 대해 설명하겠습니다.
ELifetimeRepNotifyConditionELifetimeRepNotifyCondition은 속성(예: 체력, 마나 등)의 변경을 감지하고 알림을 보낼 조건을 정의하는 열거형입니다. 주로 속성의 RepNotify 기능과 함께 사용됩니다.
이 열거형은 속성의 네트워크 리플리케이션 이벤트가 언제 호출될지를 정의합니다.
ELifetimeConditionELifetimeCondition 열거형은 속성이 네트워크에서 리플리케이션될 때 적용될 조건을 정의합니다. 각각의 값에 따라 리플리케이션을 위한 조건이 다르게 설정됩니다.
이 열거형을 통해 특정 조건에 따라 데이터를 효율적으로 전송할 수 있습니다.
DOREPLIFETIME_CONDITION_NOTIFYDOREPLIFETIME_CONDITION_NOTIFY 매크로는 Unreal Engine에서 속성을 리플리케이션할 때 사용할 조건과 알림 조건을 함께 정의할 수 있는 매크로입니다.
ELifetimeCondition으로 지정할 리플리케이션 조건ELifetimeRepNotifyCondition으로 지정할 RepNotify 조건이 매크로는 RepNotify 조건과 리플리케이션 조건을 함께 지정해줄 수 있습니다
FGameplayAttributeData와 FGameplayAttributeFGameplayAttributeDataFGameplayAttributeData는 게임플레이 속성 데이터를 저장하고 처리하는 Unreal Engine의 구조체입니다. 이 구조체는 능력 시스템과 게임플레이 속성을 관리하는 데 사용됩니다.
FGameplayAttributeData는 주로 체력, 스태미너, 마나 같은 속성을 관리하는 데 사용되며, 값 변경 시 능력 시스템이 이를 반영합니다. 예를들어 버프를 받아서 일시적으로 체력이 증가해야된다거나 디버프를 받아 방어력이 떨어지는 경우에 사용합니다.
FGameplayAttributeFGameplayAttribute는 FGameplayAttributeData 또는 float 속성을 설명하는 구조체로, 속성을 좀 더 쉽게 사용할 수 있는 기능을 제공합니다.
FProperty 값을 설정합니다.FProperty 포인터를 반환하여 원시 속성에 접근할 수 있습니다.FGameplayAttribute는 속성의 메타데이터를 담고있습니다.
//h
UCLASS()
class MYGAME_API UMyAttributeSet : public UAttributeSet
{
GENERATED_BODY()
public:
UMyAttributeSet();
UPROPERTY(EditAnywhere, BlueprintReadWrite, ReplicatedUsing = OnRep_Health, Category="Attributes")
FGameplayAttributeData Health;
UPROPERTY(EditAnywhere, BlueprintReadWrite, ReplicatedUsing = OnRep_Mana, Category="Attributes")
FGameplayAttributeData Mana;
UFUNCTION()
void OnRep_Health(const FGameplayAttributeData& OldValue);
UFUNCTION()
void OnRep_Mana(const FGameplayAttributeData& OldValue);
};
//cpp
void UMyAttributeSet::OnRep_Health(const FGameplayAttributeData& OldValue)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UMyAttributeSet, Health, OldValue);
}
void UMyAttributeSet::OnRep_Mana(const FGameplayAttributeData& OldValue)
{
GAMEPLAYATTRIBUTE_REPNOTIFY(UMyAttributeSet, Mana, OldValue);
}
UAttributeSet와 FAttributeSetInitterUAttributeSetUAttributeSet은 AbilitySystemComponent가 관리하는 게임플레이 속성 세트를 정의하는 클래스입니다. 이 클래스는 속성 값을 초기화하고 속성 변경 시 발생할 추가 동작을 정의합니다.
이 클래스는 게임 내 속성 변화와 효과를 쉽게 관리할 수 있도록 해줍니다.
FAttributeSetInitterFAttributeSetInitter는 AttributeSet의 초기 값을 설정하는 구조체입니다. 이 초기화는 데이터 테이블을 통해 이루어지며, 이터레이터를 통해 속성의 초기값을 설정할 수 있습니다.
이 구조체는 여러 단계의 초기화를 위해 게임 내 속성을 손쉽게 설정할 수 있게 합니다.
GAMEPLAYATTRIBUTE_REPNOTIFY와 ATTRIBUTE_ACCESSORSGAMEPLAYATTRIBUTE_REPNOTIFY: RepNotify를 사용하는 속성의 변경 사항을 관리하고 업데이트하는 데 사용됩니다. GetOwningAbilitySystemComponentChecked() 함수를 통해 AbilitySystemComponent에서 해당 속성의 값을 설정합니다.
ATTRIBUTE_ACCESSORS: 이 매크로는 속성에 대한 접근자(Getter)와 설정자(Setter) 함수를 자동으로 생성하여 코드를 단순화합니다.
이러한 매크로는 복잡한 속성에 대해 코드를 쉽게 관리할 수 있게 해줍니다.
Unreal Engine에서 제공하는 리플리케이션 조건과 게임플레이 속성 시스템은 온라인 멀티플레이어 게임에서 클라이언트-서버 간의 동기화 효율성을 높이는 핵심적인 기능입니다. 각 조건과 매크로는 게임 내 속성과 상태를 적절히 업데이트하고, 불필요한 데이터를 줄여 네트워크 트래픽을 최적화하는 데 중요한 역할을 합니다.