본문 바로가기
포트폴리오 제작/Project_P

Project_P AttributeSet을 사용하여 스탯 만들기

by k99812 2024. 10. 16.

AttributeSet 생성


 

AttributeSet을 상속받아 PPCharacterAttributeSet을 만든다

 

PPCharacterAttributeSet 헤더파일


#pragma once

#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "PPCharacterAttributeSet.generated.h"

#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
	GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

/**
 * 
 */
UCLASS()
class PROJECT_P_API UPPCharacterAttributeSet : public UAttributeSet
{
	GENERATED_BODY()
	
public:
	UPPCharacterAttributeSet();

	//#include "AbilitySystemComponent.h" 추가
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, AttackRange);
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, MaxAttackRange);
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, AttackRadius);
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, MaxAttackRadius);
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, AttackRate);
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, MaxAttackRate);
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, Health);
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, MaxHealth);
	ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, Damage);

protected:
	UPROPERTY(BlueprintReadOnly, Category = "Attack", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData AttackRange;

	UPROPERTY(BlueprintReadOnly, Category = "Attack", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData MaxAttackRange;

	UPROPERTY(BlueprintReadOnly, Category = "Attack", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData AttackRadius;

	UPROPERTY(BlueprintReadOnly, Category = "Attack", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData MaxAttackRadius;

	UPROPERTY(BlueprintReadOnly, Category = "Attack", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData AttackRate;

	UPROPERTY(BlueprintReadOnly, Category = "Attack", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData MaxAttackRate;

	UPROPERTY(BlueprintReadOnly, Category = "Health", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData Health;

	UPROPERTY(BlueprintReadOnly, Category = "Health", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData MaxHealth;

	UPROPERTY(BlueprintReadOnly, Category = "Attack", Meta = (AllowPrivateAccess = true))
	FGameplayAttributeData Damage;

	bool bIsDead = false;

protected:
	virtual bool PreGameplayEffectExecute(struct FGameplayEffectModCallbackData& Data) override;

	virtual void PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data) override;

	virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
};

 

  • #define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
    GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
    GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
    • 부모 클래스 UAttributeSet에 있는 매크로 함수들
    • ATTRIBUTE_ACCESSORS(어트리뷰트셋, 어트리뷰트)
      • Get, Set, Init 함수들을 만들어 줌
      • #include "AbilitySystemComponent.h" 추가
      • 사용 예) Get + 어트리뷰트 이름, GetHealth, SetHealth, InitHealth
  • UPPCharacterAttributeSet();
    • 생성자
  • ATTRIBUTE_ACCESSORS(UPPCharacterAttributeSet, AttackRange);
    • 각 어트리뷰트 마다 매크로를 통하여 Get, Set Init함수를 생성
  • UPROPERTY(BlueprintReadOnly, Category = "Attack", Meta = (AllowPrivateAccess = true))
    FGameplayAttributeData AttackRange;
    • 어트리뷰트 생성
  • virtual bool PreGameplayEffectExecute(struct FGameplayEffectModCallbackData& Data) override;
    • GameplayEffect로 어트리뷰트 수정 전 실행되는 함수
    • 활용 예) 캐릭터가 무적상태일 경우 return false를 해 어트리뷰트 수정을 못하게 할 수 있음
  • virtual void PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data) override;
    • GameplayEffect로 어트리뷰트 수정 후 실행되는 함수
  • virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
    • 어트리뷰트를 직접적으로 수정할때 실행되는 함수

 

Cpp파일


생성자

UPPCharacterAttributeSet::UPPCharacterAttributeSet() : 
	AttackRange(100.0f), MaxAttackRange(300.0f),
	AttackRadius(50.0f), MaxAttackRadius(150.0f),
	AttackRate(30.0f), MaxAttackRate(100.0f),
	MaxHealth(100.0f), Damage(0)
{
	InitHealth(GetMaxHealth());
}

 

생성한 어트리뷰트들 초기화