[UE-GAS] AttributeSet (Enum 및 매크로)

ChangJin·2024년 11월 7일

Unreal Engine - GAS

목록 보기
2/6
post-thumbnail

이번 글에서는 Unreal Engine의 Gameplay Ability System 중 AttributeSet을 중심으로, 변수와 속성들이 네트워크를 통해 어떻게 동기화되고 조정되는지, 이를 위한 조건과 알림 메커니즘에 대해 설명하겠습니다.


1. ELifetimeRepNotifyCondition

ELifetimeRepNotifyCondition은 속성(예: 체력, 마나 등)의 변경을 감지하고 알림을 보낼 조건을 정의하는 열거형입니다. 주로 속성의 RepNotify 기능과 함께 사용됩니다.

  • REPNOTIFY_OnChanged: 속성 값이 로컬 값과 다를 때에만 RepNotify 함수를 호출합니다. 값이 변경될 때만 전송하므로 효율적입니다.
  • REPNOTIFY_Always: 속성이 서버에서 수신될 때마다 RepNotify 함수를 호출합니다. 데이터가 변경되었는지 여부와 상관없이 호출합니다.

이 열거형은 속성의 네트워크 리플리케이션 이벤트가 언제 호출될지를 정의합니다.


2. ELifetimeCondition

ELifetimeCondition 열거형은 속성이 네트워크에서 리플리케이션될 때 적용될 조건을 정의합니다. 각각의 값에 따라 리플리케이션을 위한 조건이 다르게 설정됩니다.

  • COND_None: 조건 없이 변경 시마다 리플리케이션합니다.
  • COND_InitialOnly: 초기 번들에서만 전송됩니다. 생성 시 데이터만 전송할 때 유용합니다.
  • COND_OwnerOnly: 액터의 소유자에게만 전송됩니다.
  • COND_SkipOwner: 액터의 소유자를 제외한 모든 클라이언트에게 전송됩니다.
  • COND_SimulatedOnly: 시뮬레이션된 클라이언트에만 전송됩니다.
  • COND_AutonomousOnly: Autonomous 클라이언트에만 전송됩니다.
  • COND_Custom: 커스텀 조건으로, 필요에 따라 제어할 수 있습니다.

이 열거형을 통해 특정 조건에 따라 데이터를 효율적으로 전송할 수 있습니다.


3. DOREPLIFETIME_CONDITION_NOTIFY

DOREPLIFETIME_CONDITION_NOTIFY 매크로는 Unreal Engine에서 속성을 리플리케이션할 때 사용할 조건과 알림 조건을 함께 정의할 수 있는 매크로입니다.

  • c: 클래스 이름
  • v: 속성 이름
  • cond: ELifetimeCondition으로 지정할 리플리케이션 조건
  • rncond: ELifetimeRepNotifyCondition으로 지정할 RepNotify 조건

이 매크로는 RepNotify 조건과 리플리케이션 조건을 함께 지정해줄 수 있습니다


FGameplayAttributeDataFGameplayAttribute

4. FGameplayAttributeData

FGameplayAttributeData는 게임플레이 속성 데이터를 저장하고 처리하는 Unreal Engine의 구조체입니다. 이 구조체는 능력 시스템과 게임플레이 속성을 관리하는 데 사용됩니다.

  • BaseValue: 속성의 기본 값(영구적 변경 포함).
  • CurrentValue: 현재 값으로, 일시적 변경을 포함합니다.

FGameplayAttributeData는 주로 체력, 스태미너, 마나 같은 속성을 관리하는 데 사용되며, 값 변경 시 능력 시스템이 이를 반영합니다. 예를들어 버프를 받아서 일시적으로 체력이 증가해야된다거나 디버프를 받아 방어력이 떨어지는 경우에 사용합니다.


5. FGameplayAttribute

FGameplayAttributeFGameplayAttributeData 또는 float 속성을 설명하는 구조체로, 속성을 좀 더 쉽게 사용할 수 있는 기능을 제공합니다.

  • GetCurrentValue: 속성의 현재 값을 가져옵니다.
  • SetCurrentValue: 속성의 현재 값을 설정합니다.
  • SetUProperty: 속성의 FProperty 값을 설정합니다.
  • GetUProperty: 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);
}

UAttributeSetFAttributeSetInitter

6. UAttributeSet

UAttributeSetAbilitySystemComponent가 관리하는 게임플레이 속성 세트를 정의하는 클래스입니다. 이 클래스는 속성 값을 초기화하고 속성 변경 시 발생할 추가 동작을 정의합니다.

  • InitFromMetaDataTable: 데이터 테이블에서 속성을 초기화하는 함수입니다.
  • PreAttributeChangePostAttributeChange: 속성이 변경될 때 추가 처리를 수행하기 위한 함수들입니다.
  • PreGameplayEffectExecutePostGameplayEffectExecute: 게임플레이 효과가 속성에 영향을 줄 때 호출되는 함수입니다.

이 클래스는 게임 내 속성 변화와 효과를 쉽게 관리할 수 있도록 해줍니다.


7. FAttributeSetInitter

FAttributeSetInitterAttributeSet의 초기 값을 설정하는 구조체입니다. 이 초기화는 데이터 테이블을 통해 이루어지며, 이터레이터를 통해 속성의 초기값을 설정할 수 있습니다.

  • PreloadAttributeSetData: 데이터를 미리 로드하여 사용할 수 있도록 하는 함수입니다.
  • InitAttributeSetDefaults: 주어진 속성 세트를 초기화하는 함수입니다.

이 구조체는 여러 단계의 초기화를 위해 게임 내 속성을 손쉽게 설정할 수 있게 합니다.


추가 매크로와 헬퍼 함수

8. GAMEPLAYATTRIBUTE_REPNOTIFYATTRIBUTE_ACCESSORS

  • GAMEPLAYATTRIBUTE_REPNOTIFY: RepNotify를 사용하는 속성의 변경 사항을 관리하고 업데이트하는 데 사용됩니다. GetOwningAbilitySystemComponentChecked() 함수를 통해 AbilitySystemComponent에서 해당 속성의 값을 설정합니다.

  • ATTRIBUTE_ACCESSORS: 이 매크로는 속성에 대한 접근자(Getter)와 설정자(Setter) 함수를 자동으로 생성하여 코드를 단순화합니다.

이러한 매크로는 복잡한 속성에 대해 코드를 쉽게 관리할 수 있게 해줍니다.


요약

Unreal Engine에서 제공하는 리플리케이션 조건과 게임플레이 속성 시스템은 온라인 멀티플레이어 게임에서 클라이언트-서버 간의 동기화 효율성을 높이는 핵심적인 기능입니다. 각 조건과 매크로는 게임 내 속성과 상태를 적절히 업데이트하고, 불필요한 데이터를 줄여 네트워크 트래픽을 최적화하는 데 중요한 역할을 합니다.

profile
게임 프로그래머

0개의 댓글