언리얼/게임 프로젝트

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (29) 데이터 테이블을 통한 Attribute 초기

monstro 2025. 1. 23. 21:52
728x90
반응형

이번 포스트에서는 Attribute를 초기화하는 2가지 방법 중에서

데이터 테이블을 통해 초기화하는 방법을 알아보겠습니다.

그리고 동시에 향후 게임에서 사용할 Attribute를 추가하도록 하겠습니다.

 

1) AuraAttributeSet

UCLASS()
class AURA_API UAuraAttributeSet : public UAttributeSet
{
	
	.
	.
	.
    
public:

	/*
	* RPG Stat Attribute & Method
	*/

	UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Strength, Category = "Stat Attributes")
	FGameplayAttributeData Strength;
	ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Strength);

	UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Intelligence, Category = "Stat Attributes")
	FGameplayAttributeData Intelligence;
	ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Intelligence);

	UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Resilience, Category = "Stat Attributes")
	FGameplayAttributeData Resilience;
	ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Resilience);

	UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Vigor, Category = "Stat Attributes")
	FGameplayAttributeData Vigor;
	ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Vigor);

	UFUNCTION()
	void OnRep_Strength(const FGameplayAttributeData& OldStrength) const;

	UFUNCTION()
	void OnRep_Intelligence(const FGameplayAttributeData& OldIntelligence) const;

	UFUNCTION()
	void OnRep_Resilience(const FGameplayAttributeData& OldResilience) const;

	UFUNCTION()
	void OnRep_Vigor(const FGameplayAttributeData& OldVigor) const;

	.
	.
	.
    
};

 

.
.
.

void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Strength, COND_None, REPNOTIFY_Always);
	DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Intelligence, COND_None, REPNOTIFY_Always);
	DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Resilience, COND_None, REPNOTIFY_Always);
	DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Vigor, COND_None, REPNOTIFY_Always);
	
	.
	.
	.
    
}

.
.
.

void UAuraAttributeSet::OnRep_Strength(const FGameplayAttributeData& OldStrength) const
{
	GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Strength, OldStrength);
}

void UAuraAttributeSet::OnRep_Intelligence(const FGameplayAttributeData& OldIntelligence) const
{
	GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Intelligence, OldIntelligence);
}

void UAuraAttributeSet::OnRep_Resilience(const FGameplayAttributeData& OldResilience) const
{
	GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Resilience, OldResilience);
}

void UAuraAttributeSet::OnRep_Vigor(const FGameplayAttributeData& OldVigor) const
{
	GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Vigor, OldVigor);
}

.
.
.

 

위와 같이 Attribute에 RPG 게임에서 사용할 법한 새로운 능력치들을 추가하였습니다.

이제 PlayerState로 넘어가서 새로 추가된 Attribute를

Data Table로 초기화하기 위한 설정을 진행하겠습니다.

 

2) AuraPlayerState

UCLASS()
class AURA_API AAuraPlayerState : public APlayerState, public IAbilitySystemInterface
{
	
	.
	.
	.
    
protected:
	/*
	* GAS Section
	*/
	UPROPERTY(VisibleAnywhere)
	TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;

	.
	.
	.
    
};

 

기존에 감춰져 있던 ASC를 VisibleAnywhere로 설정하여 에디터에서 설정을 수행하도록 변경하였습니다.

 

3) 언리얼 에디터

 

위와 같이 새로운 AttributeMetaData를 만들겠습니다.

설정은 다음과 같이 구성하였습니다.

 

 

그리고 PlayerState의 블루 프린트에서 생성한 AttributeMetaData를 설정해주겠습니다.

 

최종실행결과는 다음과 같습니다.

 

기존에 설정한 Attribute와 중복되어 보여지고 있지만.

문제없이 Attribute가 초기화된 것을 확인할 수 있습니다.

728x90
반응형