Unreal Engine

언리얼 네트워크 프레임

띠애모 2024. 9. 16. 02:12

Net Mode

 

언리얼 엔진의 NetMode는 보통 이렇게 나뉘어진다 당연히 HUD와 UMGWidget은 game의 플레이에 영향을 주지 않는다.

game mode는 서버에만 존재한다.

 

 

1
2
3
4
NM_Standalone
NM_DedicatedServer
NM_ListenServer
NM_Client
cs

 

다음의 기준으로 NetMode를 나눌 수 있습니다.

 

1. NM_Standalone (독립 실행 모드)

  • 설명: 네트워크 연결 없이 로컬에서 게임을 실행하는 모드입니다. 네트워크를 통한 멀티플레이어 기능이 필요 없는 싱글플레이 게임이나, 게임 개발 및 디버깅을 위한 로컬 테스트에 주로 사용됩니다.
  • 용도: 싱글플레이어 게임이나 멀티플레이어 기능을 사용할 필요가 없는 상황.

2. NM_DedicatedServer (전용 서버 모드)

  • 설명: 클라이언트 역할을 하지 않고, 오직 서버 역할만 수행하는 모드입니다. 전용 서버는 플레이어 캐릭터를 직접 조작하지 않으며, 게임의 모든 네트워크 처리와 동기화 작업을 담당합니다. 이 모드는 서버 머신에서만 사용되며, 클라이언트와의 통신을 관리하는 데 중점을 둡니다.
  • 용도: 대규모 멀티플레이어 게임에서 서버 전용으로 사용되는 환경. 플레이어들은 클라이언트로 접속하여 서버와 통신하게 됩니다.

3. NM_ListenServer (리스닝 서버 모드)

  • 설명: 서버 역할과 클라이언트 역할을 동시에 수행하는 모드입니다. 호스트 플레이어는 서버로서 다른 클라이언트를 받으면서, 동시에 자신도 클라이언트처럼 게임을 플레이할 수 있습니다. 이 방식은 친구들과 함께 게임을 쉽게 호스팅할 수 있는 "호스트-클라이언트" 방식의 멀티플레이어 게임에서 자주 사용됩니다.
  • 용도: 소규모 멀티플레이어 게임에서 호스트가 직접 서버를 운영하면서 자신도 플레이하는 환경에 적합.

4. NM_Client (클라이언트 모드)

  • 설명: 클라이언트 모드는 게임 서버에 접속하여 데이터를 주고받는 역할만 수행합니다. 클라이언트는 직접 게임 서버를 호스팅하지 않으며, 대신 이미 존재하는 서버(전용 서버 또는 리스닝 서버)에 연결하여 게임을 플레이합니다.
  • 용도: 멀티플레이어 게임에서 서버에 접속하는 일반 플레이어들이 사용하는 모드입니다.

 

프레임 워크

1. AGameMode (서버 전용)

  • 역할: 게임의 규칙과 로직을 정의합니다. 예를 들어, 승리 조건, 게임 시작 및 종료 로직 등을 관리합니다.
  • 네트워크 특성: AGameMode는 오직 서버에서만 존재합니다. 클라이언트에는 존재하지 않기 때문에 서버 전용 클래스입니다.

2. AGameState (서버 & 클라이언트)

  • 역할: 게임의 현재 상태를 나타냅니다. 예를 들어, 점수, 라운드 시간 등 게임 전반의 상태 정보를 저장합니다.
  • 네트워크 특성: AGameState는 서버에 의해 관리되지만, 그 정보는 모든 클라이언트와 공유됩니다.
  •  

3. APlayerState (서버 & 클라이언트)

  • 역할: 개별 플레이어의 정보를 관리합니다. 예를 들어, 플레이어의 점수, 이름, 킬 수 등을 포함합니다.
  • 네트워크 특성: APlayerState는 각 플레이어에 대한 정보를 서버와 클라이언트 모두에 공유합니다.
  •  

4. APawn (서버 & 클라이언트)

  • 역할: 플레이어나 AI가 제어할 수 있는 게임 내 객체를 나타냅니다.
  • 네트워크 특성: APawn은 서버에서 제어되지만, 클라이언트에서도 동기화되어 표현됩니다. 클라이언트는 자신의 APawn을 직접 제어할 수 있습니다.
  •  

5. APlayerController (서버 & 소유 클라이언트)

  • 역할: 플레이어의 입력을 처리하고, 플레이어의 Pawn을 제어합니다.
  • 네트워크 특성: APlayerController는 서버와 그것을 소유하는 클라이언트 간에만 존재합니다. 즉, 각 클라이언트는 자신의 APlayerController 인스턴스를 가지고 있습니다.
  •  

6. AHUD (소유 클라이언트 전용)

  • 역할: 사용자 인터페이스를 담당합니다. 예를 들어, 점수판, 미니맵 등을 표시합니다.
  • 네트워크 특성: AHUD 클래스는 오직 소유 클라이언트에서만 존재하고 처리됩니다.

7. UMG Widgets (소유 클라이언트 전용)

  • 역할: 사용자 인터페이스의 요소들을 생성하고 관리합니다. 예를 들어, 버튼, 슬라이더, 텍스트 박스 등이 여기에 포함됩니다.
  • 네트워크 특성: UMG Widgets는 사용자의 인터페이스 요소이므로, 각 클라이언트마다 독립적으로 존재하고 관리됩니다.

이 프레임워크는 서버와 클라이언트 간의 정보의 흐름과 역할 분담을 명확하게 설명해 줍니다. 네트워크 게임 개발 시 이러한 구조를 이해하는 것이 중요하며, 효율적인 네트워크 통신 및 게임 상태 관리를 위해 설계되었습니다.

 

 

복제 시스템

복제의 기본 요소

  1. 서버-클라이언트 아키텍처:
    • 서버: 게임의 주요 로직과 상태를 관리하고, 이를 클라이언트에 전송합니다.
    • 클라이언트: 서버로부터 받은 데이터를 기반으로 사용자에게 게임을 표시합니다.
  2. 복제 대상 객체:
    • 게임 내의 특정 객체(예: 플레이어 캐릭터, AI, 무기 등)는 복제되어 다수의 클라이언트 간에 공유됩니다.
  3. 복제 속성:
    • 객체의 특정 속성(예: 위치, 상태, 점수 등)이 네트워크를 통해 동기화되어야 할 경우, 이 속성들은 복제되도록 설정할 수 있습니다.

복제의 종류

  1. 전체 복제 (Full Replication):
    • 객체의 모든 데이터가 서버로부터 모든 클라이언트로 전송됩니다. 이는 데이터 양이 많아 네트워크 트래픽이 증가할 수 있는 방법입니다.
  2. 부분 복제 (Partial Replication):
    • 객체의 특정 부분만 복제됩니다. 예를 들어, 플레이어의 위치나 상태 같은 중요한 데이터만 선택적으로 복제하여 네트워크 효율성을 높일 수 있습니다.
  3. 조건부 복제 (Conditional Replication):
    • 데이터는 특정 조건을 충족할 때만 복제됩니다. 예를 들어, 플레이어가 특정 지역에 있을 때만 그 지역의 정보를 복제하는 것입니다.

복제의 메커니즘

  • 속성 복제 (Property Replication):
    • 개발자가 클래스 내에서 Replicated 또는 ReplicatedUsing 키워드를 사용하여 속성을 표시함으로써 Unreal Engine이 자동으로 해당 속성을 네트워크를 통해 복제하도록 설정할 수 있습니다.
  • 함수 복제 (Function Replication):
    • 특정 함수가 서버에서 실행될 때 그 결과를 클라이언트에게 전달할 필요가 있을 때 사용됩니다. 함수 앞에 Server, Client, Multicast 등의 키워드를 붙여서 어디에서 함수가 실행되어야 하는지 명시합니다.
      • Server는 클라이언트에서 서버로 호출되며, 서버에서 실행됩니다.
      • Client는 서버에서 특정 클라이언트로 호출되며, 해당 클라이언트에서 실행됩니다.
      • Multicast는 서버에서 호출되어 모든 클라이언트에서 실행됩니다.

RPC (원격 프로시저 호출)

원격 프로시저 호출의 가장 큰 장점은 빠른 게임플레이 경험입니다.

미세한 조작이 중요한 게임의 경우 잠깐의 차이로 느낄 수 있는 게임 플레이의 경험이 큽니다.

클라이언트에서 어떠한 트리거를 발동 할 때 서버는 유효한지 판단하고 유효하다고 판단되면 클라이언트에 복제합니다.

언리얼 엔진에서는 서버 주도(Server Initiated) 통신과 원격 프로시저 호출(Remote Procedure Calls, RPC) 이라는 두 가지 주요 네트워크 통신 방식이 사용됩니다. 이 두 용어는 때로 혼동될 수 있지만, 각각의 특성과 사용 시나리오가 다릅니다.

서버 주도 (Server Initiated)

서버 주도 통신은 서버가 클라이언트에 정보를 전송하는 구조를 말합니다. 이 방식에서는 서버가 네트워크 상의 주요 권한을 가지고 있으며, 클라이언트의 상태를 업데이트하거나 게임 로직에 필요한 중요한 변경사항을 클라이언트에 전달합니다. 예를 들어, 게임 서버가 플레이어의 위치를 모든 클라이언트에게 주기적으로 업데이트하는 경우가 이에 해당합니다. 이는 서버가 모든 중요한 계산과 데이터 관리를 처리하며, 클라이언트는 받은 정보를 기반으로 사용자 인터페이스를 업데이트하는 방식입니다.

 

차이점

  • 서버 주도는 서버가 모든 클라이언트에 대한 상태 관리를 담당하는 반면, RPC는 특정 위치에서 특정 함수의 실행을 요청하는 더 유연한 접근 방식을 제공합니다.
  • 서버 주도 방식은 게임 상태의 중앙 집중적 관리가 필요할 때 유용하며, RPC는 상호작용이나 특정 이벤트 기반 통신에 더 적합합니다.