0. 개요

게임에 경험치 개념을 도입하기 위해서 플레이어 상태(Player State)에 경험치를 멤버 변수로 둔다.

 

 

1. 경험치 도입

(1) AuraPlayerState 플레이어 상태에서 개념 추가

private:
	UPROPERTY(VisibleAnywhere, ReplicatedUsing = OnRep_Level)
	int32 Level = 1;

	UPROPERTY(VisibleAnywhere, ReplicatedUsing = OnRep_XP)
	int32 XP = 0;

	UFUNCTION()
	void OnRep_Level(int32 OldLevel);

	UFUNCTION()
	void OnRep_XP(int32 OldXP);

경험치 레벨 계산은 서버에서 발생하고 OnRep 노티파이를 통해 클라이언트로 복제된다.

 

 

(2) 변수를 복제 대상으로 지정

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

    DOREPLIFETIME(AAuraPlayerState, Level);
    DOREPLIFETIME(AAuraPlayerState, XP);
}

 

 

 

(3) 멀티캐스트 델리게이트 선언

DECLARE_MULTICAST_DELEGATE_OneParam(FOnPlayerStatChanged, int32);

레벨 변화와 경험치 변화 등을 감지하기 위해 멀티캐스트 델리게이트를 선언한다.

 

 

(4) 경험치 Getter / Setter / Adder

	// 경험치
	FOnPlayerStatChanged OnXPChangedDelegate;

	FORCEINLINE int32 GetPlayerLevel() const { return Level; }

	FORCEINLINE int32 GetXP() const { return XP; }
	void SetXP(int32 GainedXP);
	void AddToXP(int32 GainedXP);
void AAuraPlayerState::SetXP(int32 GainedXP)
{
    XP = GainedXP;
    OnXPChangedDelegate.Broadcast(XP);
}

void AAuraPlayerState::AddToXP(int32 GainedXP)
{
    XP += GainedXP;
    OnXPChangedDelegate.Broadcast(XP);
}

void AAuraPlayerState::OnRep_Level(int32 OldLevel)
{

}

void AAuraPlayerState::OnRep_XP(int32 OldXP)
{
    // 블루프린트로 전달
    OnXPChangedDelegate.Broadcast(XP);
}

XP 변화에 대해 XPChnagedDelegate를 생성했었으므로 그를 이용해 변화된 XP를 전송한다.

OnRep_XP에서 변화된 경험치 값을 블루프린트로 전송한다.

 

 

2. 레벨

(1) 레벨 변화 델리게이트

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

FOnPlayerStatChanged는 멀티캐스트 델리게이트이므로 또 다른 리스너를 지정(시그니쳐 재활용)할 수 있다.

 

 

(2) 레벨 Getter / Setter

	void SetLevel(int32 InLevel);
	void AddToLevel(int32 InLevel);
void AAuraPlayerState::SetLevel(int32 InLevel)
{
    Level = InLevel;
    OnLevelChangedDelegate.Broadcast(Level);
}

void AAuraPlayerState::AddToLevel(int32 InLevel)
{
    Level += InLevel;
    OnLevelChangedDelegate.Broadcast(Level);
}

void AAuraPlayerState::OnRep_Level(int32 OldLevel)
{
    // 블루프린트로 전달
    OnLevelChangedDelegate.Broadcast(Level);
}