[NetDriver 생성 여부/방식] ──> NetMode(World)
│
┌──────────┴────────────┐
↓ ↓
NetConnection (월드 안의 액터)
│ ↓
┌─────────┴───────────┐ NetRole(Actor)
│ │
Client ↔ Server Authority ↔ Proxy
로직이 서버랑 클라이언트 중 어디에서 돌고 있는지 확인 가능
→ 이 게임 인스턴스가 네트워크에서 어떤 실행 모드인지 결정함
UWorld::NetMode 에 들어있는 값
NM_Standalone 네트워크 없음 (싱글플레이)
NM_ListenServer 서버 + 동시에 클라이언트
NM_DedicatedServer 서버 전용, 클라이언트 아님
NM_Client 클라이언트
NM_StandaloneNM_ListenServer 또는 NM_DedicatedServerNM_Client➡ NetDriver / NetConnection의 상태가 NetMode를 좌우한다고 보면 됨
→ 서버에서 스폰되고, 클라이언트에는 복제(Replication) 로 존재
멀티플레이 시작 시, 서버와 클라이언트 각각 자기 NetDriver를 가짐
네트워크 연결을 총괄하는 "드라이버" 객체
서버나 클라이언트가 되면 각각 하나씩 생김
NetDriver 안에는 두 속성의 NetConnection이 있음
ServerConnection (자기가 서버일 때는 비어 있음)ClientConnections (자기가 클라일 때는 비어 있음)연결을 나타내는 객체
RPC 호출이나 데이터 송수신은 이 NetConnection을 통해 이루어짐
언리얼 기본 구조는 Client ↔ Server ↔ Client 트리 형태
서버는 여러 클라를 관리 → ClientConnections 채워짐
UNetConnection 을 관리클라는 서버만 바라봄
→ ServerConnection 하나만 채워짐
클라끼리 직접 통신 불가 (항상 서버를 거쳐야 함)
Client ⇄ Server ⇄ Client
ServerConnection = nullClientConnections = [클라01, 클라02, …]ServerConnection = 서버와의 연결 OClientConnections = []ServerConnection = 서버와의 연결 OClientConnections = []AActor::Role 속성으로 존재
이 액터가 네트워크 상에서 어떤 권한을 가지는지 나타냄
ROLE_Authority
LocalRole 으로 Authority 를 가짐ROLE_AutonomousProxy
ROLE_SimulatedProxy
ROLE_None
NetRole은 NetMode 위에서 결정됨
서버에서 스폰된 액터 → 무조건 ROLE_Authority
클라가 소유한 Pawn/Character
→ 해당 클라에서만 ROLE_AutonomousProxy,
다른 클라에서는 ROLE_SimulatedProxy
UNetConnection* AActor::GetNetConnection() const
{
return Owner ? Owner->GetNetConnection() : nullptr;
}
액터를 “소유”하는 다른 액터 객체를 가리킴
일반적으로:
➡ 플레이어 입력/네트워크와 연결된 루트가 되는 게 Owner
언리얼의 RPC(Server, Client, NetMulticast) 호출은 “어떤 클라와 연결되어 있는가?”를 알아야 보낼 수 있음
이 연결 정보가 UNetConnection
그런데 액터 자신은 보통 네트워크 연결을 직접 안 들고 있음
→ Owner를 통해서 연결을 찾아야 함
그래서 Owner 없음 → “이 액터는 어느 클라이언트에도 속하지 않음” → 네트워크로 RPC 보낼 수 없음
➡ 네트워크 통신 대상이 명확하지 않으면 안전하게 차단
이게 ROLE_None 과 비슷하지만 완전히 같진 않음
ROLE_None = “이 액터는 아예 네트워크 복제 대상 아님” (Replication 자체 안 함)
Owner 없는 액터 = “네트워크는 돌지만, 특정 클라와 소유권 연결이 없다"