NetRole
게임에 중대한 영향을 끼치는 로직은 서버에서 처리해야 한다고 했다.
그래서 NetMode를 통해 현재 로직이 서버에서 도는지 클라이언트에서 도는지 확인해야 한다고 했다.
하지만 NetMode는 월드 관련 정보다. 해당 월드가 서버PC의 월드인지, 클라이언트 PC의 월드인지를 판단한다.
그러나 우리는 월드가 아니라 액터 클래스나 컴포넌트 클래스의 멤버 함수 속에서 로직을 대부분 작성한다.
그럼 그 액터가 서버PC에 스폰됐는지 클라이언트PC에 스폰됐는지, 그 액터의 멤버 함수가 어디서 실행되고 있는지 파악을 해야한다. NetRole은 이에 대한 내용이다.
Authority와 Proxy
서버에 스폰 된 액터가 가진 NetRole 속성 값은 항상 Authority다.
서버에 스폰 된 액터에서 수행될 로직은 "권한을 가지고 있다." 를 뜻한다.
게임에 중대한 영향을 끼치는 로직은 NetRole이 Authority일 때 수행해야 한다.
NetRole이 Authority인 액터가 클라이언트로 복제됐을 때 클라이언트에 복제된 액터의 NetRole 속성 값은 Proxy 다.
여기서는 중요한 로직을 수행하면 안된다.

Local Role과 Remote Role
게임에 중대한 영향을 끼치는 로직을 작성하기 위해 해당 액터가 어느 PC에 스폰 되어서 로직이 돌고 있는지 구분해야 한다.
이를 구분하기 위해 현재 동작하는 컴퓨터에서의 롤을 로컬 롤, 커넥션으로 연결 된 반대편 컴퓨터에서의 롤을 리모트 롤이라고 한다.
NetRole의 종류
| 특징 | |
| None |
|
| Authority |
|
| Autonomous Proxy |
|
| Simulated Proxy |
|

NetRole을 활용하여 정의된 중요 함수들
게임에 중대한 영향을 끼치는 데미지나 스폰 같은 로직은 서버 컴퓨터에서 실행되어야 한다.
이를 위해 언리얼은 AActor::HasAuthority() 함수를 제공한다.
// AActor.cpp
FORCEINLINE_DEBUGGABLE bool AActor::HasAuthority() const
{
return (GetLocalRole() == ROLE_Authority);
}
또한 입력 관련 로직이나 UI는 Autonomous Proxy에서 수행되야 한다.
이를 위해 AContoller::IsLocalController()와 APawn::IsLocallyContorlled() 함수가 제공된다.
// APawn.cpp
bool APawn::IsLocallyControlled() const
{
return (Controller && Controller->IsLocalController());
}
// AController.cpp
bool AController::IsLocalController() const
{
const ENetMode NetMode = GetNetMode();
if (NetMode == NM_Standalone)
{
// Not networked.
return true;
}
if (NetMode == NM_Client && GetLocalRole() == ROLE_AutonomousProxy)
{
// Networked client in control.
return true;
}
if (GetRemoteRole() != ROLE_AutonomousProxy && GetLocalRole() == ROLE_Authority)
{
// Local authority in control.
return true;
}
return false;
}
각 액터에 따른 특징
1. GameMode는 HasAuthority() 함수를 호출 할 필요가 없다.
=> GameMode는 클라이언트에 복제되지 않고 서버에만 존재하므로 게임모드의 로컬 롤은 무조건 Authority다.
2. Pawn은 Authority, Autonomous Proxy, Simulated Proxy가 혼재되어 있다.
=> 폰은 서버에 있으면 Authority, 클라이언트에 복제가 된 상태면 Simulated Proxy, 만약 복제된 폰을 로컬 컨트롤러가 소유를 하면 Autonomous Proxy 이므로 각 서버나 클라에서 그 폰을 볼 때의 로컬 롤 값이 달라진다.
3. UI 관련 로직은 클라이언트에서만 수행된다.
=> UI는 플레이어의 화면에서만 띄우면 되므로 서버에서 실행 될 필요가 없다.
로컬 롤과 리모트 롤로 나눈 이유
만약 로컬 롤만 있었다면 분간하기 어려운 케이스들이 있다.
서버에 접속한 플레이어의 캐릭터 A와 서버에서 스폰된 캐릭터 B가 있다고 가정했을 때 A와 B의 서버에서의 로컬 롤은 Authority다. 로컬 롤만으로는 서버에 접속한 플레이어의 캐릭터인지 스폰된 캐릭터인지 구분이 불가능하다.
만약 리모트 롤까지 알게 된다면 서버에 접속한 플레이어 캐릭터 A는 Autonomous Proxy고, 스폰된 캐릭터 B는 None이므로 구분이 가능하다.
구분이 가능해야 서버에서 호출되고 오너 클라이언트에서 실행 될 RPC를 구현이 가능하다.
멀티플레이에서 각 액터들을 좀 더 명확하게 분류하기 위해 로컬 롤과 리모트 롤로 나눈다.
'멀티플레이 공부' 카테고리의 다른 글
| 멀티플레이 공부(Property Replication) (0) | 2025.11.21 |
|---|---|
| 멀티플레이 공부(Remote Procedure Call, 액터 소유권, WithValidation, UnReliable, Reliable) (0) | 2025.11.20 |
| 멀티플레이 공부(NetMode, NetConnection, NetDriver, Ownership) (0) | 2025.11.18 |
| 멀티플레이 공부(Server, Client, Dedicated Server 흐름도, 특징) (0) | 2025.11.17 |
| 멀티플레이 공부(멀티 실습 환경 설정) (0) | 2025.11.14 |