Client Ownership & PlayerController

정혜창·2025년 3월 19일

독학

목록 보기
24/28

Unreal Engine에서 멀티플레이를 구현할 때 클라이언트 오너쉽(Client Ownership)플레이어 컨트롤러(Player Controller, PC)는 중요한 개념이다.
이를 이해하면 클라이언트가 특정 액터에 대한 권한을 가지는 방식과 이를 활용한 네트워크 동기화를 보다 효율적으로 설계할 수 있다.

🎮 클라이언트 오너쉽(Client Ownership)이란?

Unreal Engine의 네트워크 환경에서, 오너쉽(Ownership)은 특정 클라이언트가 서버에서 어떤 객체(액터)를 직접적으로 조작할 권리를 의미한다.

1️⃣ 오너쉽의 역할

  • 특정 클라이언트가 Server RPC를 호출할 수 있는 권한을 가짐
  • Net Owner가 설정된 액터는 해당 클라이언트가 Predicted Movement(예측 움직임)를 수행할 수 있음
  • 서버는 Owner가 있는 액터의 정보를 해당 클라이언트에게 우선적으로 업데이트해 줄 수 있음

2️⃣ 오너쉽의 기본 원칙

  • 서버에 의해 생성된 액터는 기본적으로 서버가 오너를 가짐
  • PlayerController는 항상 자신을 생성한 클라이언트가 오너이다.
  • Pawn 및 Character는 기본적으로 해당 PlayerController의 오너가 됨
  • 다른 액터들도 SetOwner(AActor* NewOwner)를 통해 오너를 변경할 수 있음

🎮 플레이어 컨트롤러(Player Controller)와의 관계

플레이어 컨트롤러의 역할

  • PlayerController는 클라이언트와 서버 간의 주요 네트워크 인터페이스
  • 특정 클라이언트에 귀속되며, 해당 클라이언트의 명령을 서버로 전달
  • 보통 한 클라이언트는 하나의 PlayerController만 가짐
  • PlayerController는 Possess()를 사용하여 Pawn을 조종할 수 있음

PlayerController와 오너쉽의 상관관계

  • 액터 유형 기본 Owner RPC 실행 가능 여부
  • PlayerController 해당 클라이언트 Server RPC 가능
  • Pawn (또는 Character) 자신을 조종하는 PlayerController Server RPC 가능
  • Actor 기본적으로 서버 Server RPC 불가능 (소유권 변경 필요)

👉 즉, 클라이언트가 직접적인 네트워크 요청을 보내려면 해당 액터가 자기 자신을 Owner로 가져야 한다.

🎮 클라이언트 오너쉽을 활용한 RPC 호출

RPC(Remote Procedure Call)를 올바르게 실행하려면 해당 액터가 클라이언트의 오너인지 확인해야 한다.

📋 플레이어가 아이템을 획득하는 예제
// 아이템 클래스 (서버에서 실행됨)
void AMyItem::Interact(APlayerController* InteractingPC)
{
    if (HasAuthority())
    {
        // 클라이언트를 Owner로 설정
        SetOwner(InteractingPC);
    }
}

👉 이렇게 하면 SetOwner(InteractingPC)를 호출한 후, 이 아이템은 해당 클라이언트가 오너가 됨.

📋 RPC 실행 가능 여부 확인
UFUNCTION(Server, Reliable)
void ServerUseItem();
void AMyItem::UseItem()
{
    if (GetOwner() == GetWorld()->GetFirstPlayerController())  // 클라이언트가 오너인지 확인
    {
        ServerUseItem(); // 서버에 요청 가능
    }
}

👉 이제 ServerUseItem()이 실행될 때, 클라이언트가 오너인 경우에만 호출할 수 있음.

🎮 Ownership과 Net Relevancy의 관계

SetOwner()를 설정하면, 서버는 해당 액터를 해당 클라이언트에게만 우선적으로 네트워크 복제를 수행한다.

  • Owner가 설정된 액터는 그 Owner에게 더 자주 업데이트됨
  • bOnlyRelevantToOwner = true이면 해당 오너 클라이언트에게만 복제됨
  • bNetLoadOnClient = false 설정을 통해 특정 클라이언트에게만 동기화할 수 있음
// 오너에게만 복제하는 액터 설정
MyActor->SetOwner(SomePlayerController);
MyActor->bOnlyRelevantToOwner = true;

이렇게 하면 다른 클라이언트들에게는 불필요한 네트워크 트래픽을 줄일 수 있다.

🎮 오너쉽을 활용한 대표적인 멀티플레이 기능

🎮 정리

✅ 클라이언트 오너쉽과 플레이어 컨트롤러의 핵심 원칙

  • PlayerController는 항상 해당 클라이언트의 오너이다.
  • Pawn은 기본적으로 PlayerController를 오너로 가진다.
  • SetOwner(APlayerController*)를 호출하면, 해당 클라이언트가 소유자로 설정된다.
  • 클라이언트가 Server RPC를 호출하려면 해당 액터의 Owner가 되어야 한다.
  • bOnlyRelevantToOwner = true를 활용하면 특정 클라이언트에게만 데이터를 전송할 수 있다.
profile
Unreal 1기

0개의 댓글