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);
}
해당 코드를 보면 대략적으로 어떤 역할을 하는지 파악할 수 있다. 그러나 정확하게 동작 방식이 이해되지는 않는다. 따라서 순서를 정리하면 다음과 같다.
- 서버에서 데이터 변경 (예: AddXp, 레벨 업 등) 한다.
- 서버는 변경된 데이터를 클라이언트로 복제한다 (DOREPLIFETIME_CONDITION에 따라).
- 클라이언트는 복제된 데이터를 수신하고, 관련된 복제 함수 (예: OnRep_Xp, OnRep_CharacterLevelUp)를 실행한다.
- 이벤트 브로드캐스트를 통해 클라이언트에서 추가적인 처리가 이루어진다 (예: UI 업데이트 등)
GetLifetimeReplicatedProps()
이전 글에서 "Replicated"나 "ReplicatedUsing" 어트리뷰트로 지정된 복제 프로퍼티는 모두 AActor::GetLifetimeReplicatedProps() 멤버 함수 내에서 DOREPLIFETIME() 매크로를 사용하여 선언해야 한다는 내용이 있었다. 즉, 올바른 통신을 위해서는 GetLifetimeReplicatedProps()에서 사용할 데이터와 추가적으로 어떻게 활용할지를 작성해야 한다.
'Unreal > 언리얼 엔진 5로 개발하는 멀티플레이어 게임(Book)' 카테고리의 다른 글
[Unreal] US_Character Class 코드 분석(RPC 달리기) (0) | 2025.03.28 |
---|---|
[Unreal] 원격 프로시저 호출(RPC) (0) | 2025.03.26 |
[Unreal] US_PlayerState.h 코드 분석 (0) | 2025.03.25 |
[Unreal] 프로퍼티 복제 (0) | 2025.03.25 |
[Unreal] US_Character Class 코드 분석(데이터 테이블 읽기) (0) | 2025.03.25 |