1. PlayerState란?

  • 각 플레이어의 상태 정보(점수, 닉네임, 팀, 커스텀 등)를 저장하는 Actor
  • 서버에서 생성되며, 모든 클라이언트에 복제(Replicated) 되어 공유
  • PlayerController는 입력/시점 등의 "행동"을 담당하고, PlayerState는 "정보"를 담당

 

2. 서버-클라이언트 간 PlayerState의 위치와 역할

  • 서버와 클라이언트 모두 모든 플레이어의 PlayerState를 보유
  • 각 머신에서의 Role:
머신 PlayerState의 Role
서버 ROLE_Authority (권한 있음)
클라이언트 ROLE_SimulatedProxy (읽기 전용)
  • 클라이언트 입장에서 PlayerState는 로컬 소유가 아니며 AutonomousProxy가 아님 → 직접 수정 불가.

 

3. 생성 흐름: GameMode → PlayerController → PlayerState

(1). 클라이언트가 서버에 접속 요청

(2). 서버가 GameMode에서 PlayerController 생성

(3). GameMode::PostLogin() 호출

(4). PlayerController::InitPlayerState() 호출

  • GameMode->SpawnPlayerState()로 PlayerState 생성
  • 생성된 PlayerState를 PlayerController에 연결

(5). GameState->PlayerArray에 등록

(6). PlayerState가 클라이언트로 복제됨

 


4. PlayerState 주요 활용 예시

  • 닉네임 및 유저 정보 저장
  • 점수, 킬/데스 수 기록
  • 커스텀 외형(치장 아이템) 저장
  • 이모티콘 / 감정 표현 정보 전달
// MyPlayerState.h

UCLASS()
class CCFF_API AMyPlayerState : public APlayerState
{
    GENERATED_BODY()

public:
    // 치장 데이터
    UPROPERTY(ReplicatedUsing = OnRep_EquippedItems)
    TMap<EEquipSlot, TObjectPtr<UCustomizationItemAsset>> EquippedItems;

    void SetEquippedItem(EEquipSlot Slot, UCustomizationItemAsset* Item);

    // 클라에서 외형 반영
    UFUNCTION()
    void OnRep_EquippedItems();
};
// MyPlayerState.cpp

void AMyPlayerState::SetEquippedItem(EEquipSlot Slot, UCustomizationItemAsset* Item)
{
    if (HasAuthority())
    {
        EquippedItems.FindOrAdd(Slot) = Item;
        OnRep_EquippedItems(); // 서버에서도 즉시 반영
    }
}

void AMyPlayerState::OnRep_EquippedItems()
{
    if (ACharacter* OwnerCharacter = Cast<ACharacter>(GetPawn()))
    {
        if (UCharacterCustomizationComponent* CustomComp = OwnerCharacter->FindComponentByClass<UCharacterCustomizationComponent>())
        {
            CustomComp->ApplyCustomizationFromPlayerState();
        }
    }
}

'TIL > C++와 UE' 카테고리의 다른 글

온도 시스템  (0) 2025.06.04
GameInstanceSubsystem  (0) 2025.04.02
Object Pooling  (0) 2025.03.28
언리얼 엔진 레플리케이션(Replication)  (0) 2025.03.11
네트워킹 및 멀티 플레이어 개요  (0) 2025.03.10