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 |