본문 바로가기

게임프로그래밍/실습2

[실습2] 13. 체력과 마나 어트리뷰트 만들기

1. 어트리뷰트 추가하기

 

Attribute Set 클래스가 존재하고 이곳에 실제로 속성들을 지정할 수 있다.

 

어트리뷰트 세트 클래스로 들어가자. 각종 속성들은 Pulbic 섹션에서 정의할 것이다.

FGameplayAttributeData 구조체를 통해 이러한 정보를 저장할 수 있다.

 

class PRACTICE2_API UAuraAttributeSet : public UAttributeSet
{
	GENERATED_BODY()

public:
	UAuraAttributeSet();

	UPROPERTY(ReplicatedUsing = OnRep_Health)
	FGameplayAttributeData Health;

	UFUNCTION()
	void OnRep_Health(const FGameplayAttributeData& OldHealth);
};

 

UPROPERTY(ReplicatedUsing = OnRep_Health)
FGameplayAttributeData Health;

 

ReplicatedUsing 매크로는 서버에서 클라이언트로 해당 어트리뷰트데이터가 복제가 일어날때 호출하는 함수를 지정하는 것이다.
이를 통해 데이터의 변화가 있을 때 다양한 작업들을 할 수 있다.
#include "AbilitySystemComponent.h"

void UAuraAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) const
{
	GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Health, OldHealth);
}

 

콜백 함수에서 위와 같은 매크로를 호출한다. 위의 매크로는 콜백함수가 호출될때 해당 어트리뷰트 데이터를 업데이트하는 매크로이다. 
 
이렇게만 한다고 복제가 다 끝나는 것은 아니다. 레플리케이션 지원을 활성화 해야하며 이는 특별한 함수를 오버라이드 하여 가능해진다.
 
virtual void GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const override;

 

위의 함수에서 어트리뷰트 데이터를 레플리케이션 시스템에 등록해야 한다.

 

해당 함수 내에 매크로를 추가해주자

DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Health, COND_None, REPNOTIFY_Always);

 

해당 매크로의 첫번째 인자는 해당 어트리뷰트 데이터가 있는 클래스,

두번째 인자는 레플리케이션에 등록할 어트리뷰트 데이터,

세번째는 복제조건(현재 따로 조건은 없다)

네번째는 리노티파이를 언제할지 설정하는 것이다.

 

체력 속성을 만드는데 성공했으니 최대 체력과 마나 최대마나 속성들을 만들도록 하자.

 

UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxHealth, Category="Vital Attributes")
FGameplayAttributeData MaxHealth;
UFUNCTION()
void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const;

 

void UAuraAttributeSet::OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const
{
    GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, MaxHealth, OldMaxHealth)
}
void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	//health부분 생략
    DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, MaxHealth, COND_None, REPNOTIFY_Always);
}

 

MaxHeal는 위와 같이 설정해주었다.

 

마나와 최대마나 속성도 위와 같이 추가해주면 된다.