본문 바로가기

Unreal/언리얼 엔진 5로 개발하는 멀티플레이어 게임(Book)

[Unreal] US_PlayerState.cpp 코드 분석

US_PlayerState.cpp

void AUS_PlayerState::AddXp(const int32 Value)
{
    Xp += Value;
    OnXpChanged.Broadcast(Xp);

    GEngine->AddOnScreenDebugMessage(0, 5.f, FColor::Yellow, FString::Printf(TEXT("Total Xp: %d"), Value));

    if (const auto Character = Cast<AUS_Character>(GetPawn()))
    {
        if (Character->GetCharacterStats()->NextLevelXp < Xp)
        {
            GEngine->AddOnScreenDebugMessage(3, 5.f, FColor::Red, TEXT("Level Up!"));

            CharacterLevel++;
            Character->UpdateCharacterStats(CharacterLevel);
            OnCharacterLevelUp.Broadcast(CharacterLevel);
        }
    }
}

void AUS_PlayerState::OnRep_Xp(int32 OldValue) const
{
    OnXpChanged.Broadcast(Xp);
}

void AUS_PlayerState::OnRep_CharacterLevelUp(int32 OldValue) const
{
    OnCharacterLevelUp.Broadcast(CharacterLevel);
}

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

	DOREPLIFETIME_CONDITION(AUS_PlayerState, Xp, COND_OwnerOnly);
	DOREPLIFETIME_CONDITION(AUS_PlayerState, CharacterLevel, COND_OwnerOnly);
}

 

 

해당 코드를 보면 대략적으로 어떤 역할을 하는지 파악할 수 있다. 그러나 정확하게 동작 방식이 이해되지는 않는다. 따라서 순서를 정리하면 다음과 같다.

  1. 서버에서 데이터 변경 (예: AddXp, 레벨 업 등) 한다.
  2. 서버는 변경된 데이터를 클라이언트로 복제한다 (DOREPLIFETIME_CONDITION에 따라).
  3. 클라이언트는 복제된 데이터를 수신하고, 관련된 복제 함수 (예: OnRep_Xp, OnRep_CharacterLevelUp)를 실행한다.
  4. 이벤트 브로드캐스트를 통해 클라이언트에서 추가적인 처리가 이루어진다 (예: UI 업데이트 등)

GetLifetimeReplicatedProps()

이전 글에서 "Replicated"나 "ReplicatedUsing" 어트리뷰트로 지정된 복제 프로퍼티는 모두 AActor::GetLifetimeReplicatedProps() 멤버 함수 내에서 DOREPLIFETIME() 매크로를 사용하여 선언해야 한다는 내용이 있었다. 즉, 올바른 통신을 위해서는 GetLifetimeReplicatedProps()에서 사용할 데이터와 추가적으로 어떻게 활용할지를 작성해야 한다.