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를 활용하면 특정 클라이언트에게만 데이터를 전송할 수 있다.