멀티플레이어 게임 개발 3 (NetMode, NetDriver, NetConnection, NetRole, Ownership)

김여울·2025년 9월 2일

내일배움캠프

목록 보기
67/139
[NetDriver 생성 여부/방식] ──> NetMode(World)
                                     │
                          ┌──────────┴────────────┐
                          ↓                     ↓
                     NetConnection        (월드 안의 액터)
                         │                     ↓
                ┌─────────┴───────────┐        NetRole(Actor)
                │                   │
          Client ↔ Server     Authority ↔ Proxy

1. NetMode (월드 단위)

1.1 특징

  • 로직이 서버랑 클라이언트 중 어디에서 돌고 있는지 확인 가능
    → 이 게임 인스턴스가 네트워크에서 어떤 실행 모드인지 결정함

  • UWorld::NetMode 에 들어있는 값

1.2 종류

  • NM_Standalone 네트워크 없음 (싱글플레이)

  • NM_ListenServer 서버 + 동시에 클라이언트

  • NM_DedicatedServer 서버 전용, 클라이언트 아님

  • NM_Client 클라이언트

1.3 결정 방식

  • NetDriver가 생성될 때 결정됨
    • NetDriver가 없음
      NM_Standalone
    • NetDriver가 서버 모드로 실행
      NM_ListenServer 또는 NM_DedicatedServer
    • NetDriver가 클라이언트 모드로 실행
      NM_Client

NetDriver / NetConnection의 상태가 NetMode를 좌우한다고 보면 됨

1.4 NetMode에 따른 액터/오브젝트 존재 범위

서버에만 존재

  • GameMode
    • 게임 규칙/로직 담당
    • 서버 권한 전용, 클라이언트에는 절대 존재하지 않음
  • GameSession, GameStateBase(ServerAuth 부분) 일부도 서버 주도

서버 + 모든 클라이언트에 존재

  • 월드에 배치된 액터들 (StaticMeshActor, BackgroundActor 등)
  • Pawn / Character (플레이어 폰)
  • PlayerState (플레이어 상태 정보, 점수/이름 등 → Replicate)
  • GameState (게임 전체 상태 → Replicate)

→ 서버에서 스폰되고, 클라이언트에는 복제(Replication) 로 존재

서버 + 해당 클라이언트에만 존재

  • PlayerController
    • 서버에는 모든 클라이언트의 PlayerController가 있음
    • 클라이언트에는 “자기 자신의 PlayerController”만 존재
  • AnimInstance (애니메이션 블루프린트)
    • 폰/메시에 종속되기 때문에 각 클라이언트 로컬에도 생성됨
    • 서버에는 시뮬레이션용으로도 존재

클라이언트 로컬에만 존재

  • UI 위젯 (UMG, HUD 위젯)
    • 로컬 전용, 서버와 공유되지 않음
  • 로컬 전용 컴포넌트/이펙트 (예: 카메라 이펙트, 화면 흔들림, UI 커서)
  • Input 처리 로직 일부

2. NetDriver

2.1 구조

  • 멀티플레이 시작 시, 서버와 클라이언트 각각 자기 NetDriver를 가짐

  • 네트워크 연결을 총괄하는 "드라이버" 객체

  • 서버나 클라이언트가 되면 각각 하나씩 생김

2.2 속성 (NetConnection)

NetDriver 안에는 두 속성의 NetConnection이 있음

  • ServerConnection (자기가 서버일 때는 비어 있음)
  • ClientConnections (자기가 클라일 때는 비어 있음)

3. NetConnection

3.1 특징

  • 연결을 나타내는 객체

  • RPC 호출이나 데이터 송수신은 이 NetConnection을 통해 이루어짐

  • 언리얼 기본 구조는 Client ↔ Server ↔ Client 트리 형태

  • 서버는 여러 클라를 관리ClientConnections 채워짐

    • 접속한 클라이언트의 수 만큼 UNetConnection 을 관리
  • 클라는 서버만 바라봄
    ServerConnection 하나만 채워짐

  • 클라끼리 직접 통신 불가 (항상 서버를 거쳐야 함)
    ClientServerClient

3.2 종류

Dedicated Server (서버 전용)

  • ServerConnection = null
    자기가 서버니까 서버 연결 불필요
  • ClientConnections = [클라01, 클라02, …]
    연결된 클라 목록, TArray 배열

Client01 (클라이언트)

  • ServerConnection = 서버와의 연결 O
  • ClientConnections = []
    클라끼리 직접 연결 X

Client02 (클라이언트)

  • ServerConnection = 서버와의 연결 O
  • ClientConnections = []

4. NetRole (액터 단위)

4.1 특징

  • AActor::Role 속성으로 존재

  • 이 액터가 네트워크 상에서 어떤 권한을 가지는지 나타냄

4.2 종류

  • ROLE_Authority

    • 서버가 소유하는 상태 (서버가 원본)
      → 게임에 중대한 영향을 끼치는 로직은 NetRole이 Authority일 때 수행
    • 서버에서 스폰된 액터가 LocalRole 으로 Authority 를 가짐
  • ROLE_AutonomousProxy

    • Authority 액터의 복제본
    • 서버로부터 데이터를 수신 받아서 동기화도 되면서, 서버로 송신도 가능
    • 클라이언트가 자기 자신(Owner)의 액터를 제어하는 경우 (예: 내 캐릭터)
  • ROLE_SimulatedProxy

    • Authority 액터의 복제본
    • 서버로부터 수신 받아서 동기화 당하기만 함
    • 다른 클라의 액터, 서버가 보낸 상태를 시뮬레이션만 하는 경우
  • ROLE_None

    • 네트워크와 전혀 동기화되지 않는 액터 상태
      (순수 로컬 전용 액터 | 테스트/디버그용 | 퍼포먼스 최적화)
      Replication 대상 아님
      → 서버 ↔ 클라 사이에 이 액터 정보는 오가지 않음

4.3 결정 방식

NetRole은 NetMode 위에서 결정됨

  • 서버에서 스폰된 액터 → 무조건 ROLE_Authority

  • 클라가 소유한 Pawn/Character
    → 해당 클라에서만 ROLE_AutonomousProxy,
    다른 클라에서는 ROLE_SimulatedProxy

5. 액터의 네트워크 소유권 (Ownership)

5.1 AActor::GetNetConnection()

UNetConnection* AActor::GetNetConnection() const
{
    return Owner ? Owner->GetNetConnection() : nullptr;
}
  • Owner 가 있으면 → Owner의 NetConnection 따라감
  • Owner 가 없으면 → nullptr 반환 → 이 액터는 네트워크 연결 없음

5.2 Owner

  • 액터를 “소유”하는 다른 액터 객체를 가리킴

  • 일반적으로:

    • PlayerController → Pawn/Character
      (플레이어가 조종하는 캐릭터)
    • Pawn → 무기/총알 같은 액터
      (내 캐릭터가 스폰한 무기)
    • PlayerState → HUD/UI Helper 이런 구조도 가능

    ➡ 플레이어 입력/네트워크와 연결된 루트가 되는 게 Owner

5.3 Owner 없으면 통신이 불가능

  • 언리얼의 RPC(Server, Client, NetMulticast) 호출은 “어떤 클라와 연결되어 있는가?”를 알아야 보낼 수 있음

  • 이 연결 정보가 UNetConnection

  • 그런데 액터 자신은 보통 네트워크 연결을 직접 안 들고 있음
    → Owner를 통해서 연결을 찾아야 함

  • 그래서 Owner 없음 → “이 액터는 어느 클라이언트에도 속하지 않음” → 네트워크로 RPC 보낼 수 없음

    ➡ 네트워크 통신 대상이 명확하지 않으면 안전하게 차단

5.4 주의

이게 ROLE_None 과 비슷하지만 완전히 같진 않음

  • ROLE_None = “이 액터는 아예 네트워크 복제 대상 아님” (Replication 자체 안 함)

  • Owner 없는 액터 = “네트워크는 돌지만, 특정 클라와 소유권 연결이 없다"

    • 예: 서버가 소유하는 환경 오브젝트 (나무, 돌) → Owner 없음
    • 이런 건 서버가 권위(Authority)만 가지고, 클라와 연결된 통신(RPC)은 못 함

0개의 댓글