0. 개요

레벨업 보상인 속성 포인트와 스펠 포인트를 구현하기 위해 플레이어 상태 클래스의 멤버 변수로 선언한다.

델리게이트를 사용하여 위젯 컨트롤러로 전달한다.

 

 

1. 속성 포인트와 스펠 포인트

(1) AuraPlayerState에서 멤버 변수로 선언

	UPROPERTY(VisibleAnywhere, ReplicatedUsing = OnRep_AttributePoint)
	int32 AttributePoint = 0;

	UPROPERTY(VisibleAnywhere, ReplicatedUsing = OnRep_SpellPoint)
	int32 SpellPoint = 0;

OnRep 함수를 사용하여 복제 시 델리게이트가 발동되도록 할 것이다.

 

 

(2) 델리게이트 선언

	// 경험치, 레벨
	FOnPlayerStatChanged OnXPChangedDelegate;
	FOnPlayerStatChanged OnLevelChangedDelegate;
	FOnPlayerStatChanged OnAttributePointChangedDelegate;
	FOnPlayerStatChanged OnSpellPointChangedDelegate;

이전에 경험치와 레벨에 대해 변화 델리게이트를 생성했던 것과 같이 델리게이트를 선언한다.

 

 

(3) 델리게이트의 콜백 함수 호출

void AAuraPlayerState::OnRep_AttributePoint(int32 OldAttributePoint)
{
    OnAttributePointChangedDelegate.Broadcast(AttributePoint);
}

void AAuraPlayerState::OnRep_SpellPoint(int32 OldSpellPoint)
{
    OnSpellPointChangedDelegate.Broadcast(SpellPoint);
}

 

 

(4) AttributeMenuWidgetController에서 델리게이트 바인딩

(4-1) 블루프린트 델리게이트 선언

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPlayerPointsChangedSignature, int32, NewValue);
	UPROPERTY(BlueprintAssignable, Category = "GAS|Level")
	FOnPlayerPointsChangedSignature OnAttributePointChangedDelegate;

	UPROPERTY(BlueprintAssignable, Category = "GAS|Level")
	FOnPlayerPointsChangedSignature OnSpellPointChangedDelegate;

블루프린트로 정보를 넘기기 위해 속성 포인트와 스펠 포인트 변화에 대한 델리게이트를 선언한다.

 

 

(4-2) 속성 포인트와 스펠 포인트 델리게이트에 람다 함수 바인딩

위의 3번에서 선언했던 델리게이트에 람다 함수를 바인딩한다.

해당 람다 함수는 블루프린트 버전의 이벤트를 호출한다.

void UAttributeMenuWidgetController::BindCallbacksToDependencies()
{
	// 속성 세트 가져오기
	UAuraAttributeSet* AS = CastChecked<UAuraAttributeSet>(AttributeSet);
	check(AttributeInfo);

	// 플레이어 상태 가져옴
	AAuraPlayerState* AuraPlayerState = CastChecked<AAuraPlayerState>(PlayerState);
	AuraPlayerState->OnAttributePointChangedDelegate.AddLambda([this](int32 NewValue)
		{
			// 블루프린트 델리게이트 호출
			OnAttributePointChangedDelegate.Broadcast(NewValue);
		});

	AuraPlayerState->OnSpellPointChangedDelegate.AddLambda([this](int32 NewValue)
		{
			// 블루프린트 델리게이트 호출
			OnSpellPointChangedDelegate.Broadcast(NewValue);
		});

 

 

(5) 속성 메뉴 블루프린트

속성 메뉴의 맨 윗줄을 속성 포인트로 할 것이다.

이름을 변경하고 변수로 지정한다.

 

(5-1) 속성 포인트 이름 변경

Row의 함수인 Set Label Text 함수를 사용하여 표시되는 이름을 변경한다.

 

 

(5-2) 속성 포인트 줄에 위젯 컨트롤러 연결

델리게이트 이벤트를 할당하기 위해 속성 포인트 줄에 위젯 컨트롤러를 연결한다.

 

 

(5-3) 델리게이트 이벤트 바인딩

값을 가져와 Row의 값을 변경하게 한다.

 

 

(6) 속성 포인트와 스펠 포인트에 대한 Getter와 Setter 정의

	FORCEINLINE int32 GetCharacterLevel() const { return Level; }
	FORCEINLINE int32 GetXP() const { return XP; }
	FORCEINLINE int32 GetAttributePoints() const { return AttributePoints; }
	FORCEINLINE int32 GetSpellPoints() const { return SpellPoints; }
	void SetXP(int32 GainedXP);
	void AddToXP(int32 GainedXP);
	void SetLevel(int32 InLevel);
	void AddToLevel(int32 InLevel);
	void SetAttributePoints(int32 InAP);
	void AddToAttributePoints(int32 InAP);
	void SetSpellPoints(int32 InSP);
	void AddToSpellPoints(int32 InSP);
void AAuraPlayerState::SetAttributePoints(int32 InAP)
{
    AttributePoints = InAP;
    OnAttributePointChangedDelegate.Broadcast(AttributePoints);
}

void AAuraPlayerState::AddToAttributePoints(int32 InAP)
{
    AttributePoints += InAP;
    OnAttributePointChangedDelegate.Broadcast(AttributePoints);
}

void AAuraPlayerState::SetSpellPoints(int32 InSP)
{
    SpellPoints = InSP;
    OnSpellPointChangedDelegate.Broadcast(SpellPoints);
}

void AAuraPlayerState::AddToSpellPoints(int32 InSP)
{
    SpellPoints += InSP;
    OnSpellPointChangedDelegate.Broadcast(SpellPoints);
}

 

 

2. 속성 포인트 행 위젯 블루프린트

(1) TextValueRow 위젯 복제 후 수정

 

 

(2) WBP_AttributePointsRow 이벤트 그래프

(2-1) 위젯 컨트롤러의 블루프린트 버전 가져오기

이벤트에 할당하기 위해 위젯 컨트롤러의 블루프린트 버전을 멤버 변수로 저장한다.

 

(2-2) 이벤트 할당

속성 포인트가 변화하면 텍스트에 반영한다.

 

 

(3) 속성 메뉴의 첫 행을 속성 포인트 행으로 변경

기존의 행을 제거하고 새롭게 생성한 행을 배치한다.

 

(4) 속성 포인트 행에 위젯 컨트롤러 설정

 

 

(5) AttributeMenuWidgetController에서 속성 포인트의 초기 값 설정

BroadcastInitialValues 함수를 수정한다.

void UAttributeMenuWidgetController::BroadcastInitialValues()
{
	UAuraAttributeSet* AS = CastChecked<UAuraAttributeSet>(AttributeSet);
	check(AttributeInfo);

	for (auto& Pair : AS->TagsToAttributes)
	{
		BroadcastAttributeInfo(Pair.Key, Pair.Value());
	}

	// 플레이어 상태 가져옴
	AAuraPlayerState* AuraPlayerState = CastChecked<AAuraPlayerState>(PlayerState);
	AuraPlayerState->OnAttributePointChangedDelegate.Broadcast(AuraPlayerState->GetAttributePoints());
}

 

 

 

(6) AuraCharacter에서 속성 포인트와 스펠 포인트 부여

void AAuraCharacter::AddToAttributePoints_Implementation(int32 InAttributePoints)
{
    // TODO : 속성 포인트 PlayerState에 구현
    AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
    check(AuraPlayerState);
    AuraPlayerState->AddToAttributePoints(InAttributePoints);
}

void AAuraCharacter::AddToSpellPoints_Implementation(int32 InSpellPoints)
{
    // TODO : 속성 포인트 PlayerState에 구현
    AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
    check(AuraPlayerState);
    AuraPlayerState->AddToSpellPoints(InSpellPoints);
}

PlayerInterface의 오버라이드 함수를 수정하여 포인트를 추가하게 한다.