언리얼엔진5 공부

ENetMode

Client Side 2025. 11. 18. 22:27

ENetMode (네트워크 모드)

  • 현재 실행 중인 게임 월드가 어떤 네트워크 역할을 하고 있는지를 나타내는 열거형 값.
  • 싱글(NM_StandAlone) 서버(NM_Listen, NM_DedicatedServer), 클라이언트(NM_Client)
    • NM_StandAlone (스탠드얼론 모드)
      • 역할 : 네트워크 연결 없이 혼자 실행되는 게임 모드. 오프라인 싱글플레이.
      • 특징 : NetDriver나 NetConnection 같은 네트워크 관련 객체가 아예 없거나, 있더라도 통신에 사용되지 않는다.
    • NM_Client (클라이언트 모드)
      • 역할 : 다른 서버에 접속해서 게임을 플레이하는 모드. 플레이어의 입력은 서버로 보내지고, 서버로부터 게임 상태를 받아와서 화면에 그린다.
      • 특징 : 딱 하나의 NetConnection만 가지고 있다. 이 연결은 항상 서버를 향해 있다. (다른 클라이언트와 직접 연결되지 않는다.)
    • NM_ListenServer (리스너 서버 모드)
      • 역할 : 서버 역할과 클라이언트(로컬 플레이어) 역할을 동시에 수행하는 모드. ‘방장이 직접 플레이하면서 다른 플레이어들을 초대하는 방식’의 멀티플레이 게임이 이 모드에 해당한다.
      • 특징 : 자신을 포함한 여러 NetConnection들을 관리할 수 있고, 동시에 로컬 플레이어로서 서버 로직을 직접 실행한다.
    • NM_DedicatedServer (전용 서버 모드)
      • 역할 : 오직 서버 역할만 전담하는 모드. 로컬 플레이어가 존재하지 않고, 다른 클라이언트들의 연결을 기다리고 관리하며 게임 로직만 수행한다.
      • 특징 : 여러 NetConnection들을 관리하며, 절대 클라이언트처럼 화면에 캐릭터를 직접 조작하는 일은 없다.
  • NetMode의 필요성
  • 우리가 작성하고 있는 로직이 서버에서 돌고 있는지 클라이언트에서 돌고 있는지를 알아야 하는데 그때 필요한 것이 NetMode.
  • UWorld::InternalGetNetMode() 함수
    • 현재 게임월드의 네트워크 모드를 반환해준다.
    •  
ENetMode UWorld::InternalGetNetMode() const
{
	if (NetDriver != NULL)
		{
			const bool bIsClientOnly = IsRunningClientOnly();
			return bIsClientOnly ? NM_Client : NetDriver->GetNetMode();
		}
}
  • NetDriver는 UNetDriver 타입의 포인터 변수.
    • 언리얼 엔진의 네트워크 통신을 전반적으로 관리하는 핵심 객체
    • 서버와 클라이언트 간의 데이터 송수신, 패킷 처리 등을 담당하는 드라이버 같은 존재.
  • 만약 이 월드에 NetDrive(네트워크 관리 객체)가 존재한다면, 멀티 게임이다.
  • IsRunningClientOnly() : 현재 월드가 클라이언트 모드만으로 실행중인가?
    • 만약 게임이 멀티플레이어 환경에서 클라이언트로 실행중이고, 서버 기능은 전혀 담당하지 않는 순수 클라이언트라면 true를 반환한다.
  • 삼항연산자를 통해 true이면 NM_Client를 반환하고, 아니라면 NetDriver가 가지고 있는 실제 네트워크 모드를 반환한다.

 

UNetConnection

  • 개념
    • UNetDriver가 관리하는, 특정 원격 지점(다른 클라이언트나 서버)과의 “1대1 통신 채널”이다. 마치 한 개의 전화선 또는 전용 이메일 스레드처럼, 특정 상대방과만 데이터를 주고받는 통로를 담당한다.
    • UNetDriver가 UNetConnection들을 생성하고 감독하는 역할이라면, UNetConnection은 그 감독 아래에서 실제 통신 임무를 수행하는 개별 통신원 간은 역할. 서버 NetDriver는 연결된 클라이언트 수만큰 NetConnection을 가지고 있고, 클라이언트 NetDriver는 서버와의 통신을 위한 NetConnection을 하나 가지고 있다.
  • 다른 PC와의 연결이 발생하면 그에 대응하는 UNetConnection 객체도 생성된다.
  • 서버에 클라이언트가 접속하면 서버에는 ClientConnection 객체가 추가된다.
  • 반대로 클라이언트에는 ServerConnection 객체가 생성된다.
  • 두 PC는 UNetConnection 객체를 통해 통신하게 된다.
  • UNetDriver는 생성된 UNetConnection 객체를 소유하고 관리하고 있다.
  • 서버 PC에 생성된 UNetDriver는 접속한 클라이언트의 수 만큼 UNetConnection을 관리한다.
  • 클라이언트 PC에 생성된 UNetDriver는 ServerConnection 단 하나만을 관리한다.

 

UNetDriver (네트워크 드라이버)

  • 개념
    • 네트워크 통신의 핵심 엔진이자 관리자.
    • 네트워크 통신이 필요한 모든 인스턴스에 존재한다. (서버, 클라이언트)
    • 모든 네트워크 패킷의 송수신, 연결 관리, 신뢰성 보장, 압축, 암호화 등 복잡하고 저수준의 네트워크 작업을 총괄하는 역할을 담당한다. 데임 월드와 실제 네트워크 카드(NIC) 사이의 다리라고 생각하면 된다.
  • 주요 역할
    • 연결 관리
      • 여러 UNetConnection 객체들을 만들고 관리한다. 서버는 여러 클라이언트 연결을, 클라이언트는 서버로의 단일 연결을 NetDriver를 통해 관리한다.
    • 패킷 처리
      • 게임에서 주고받는 데이터를 실제 네트워크 패킷으로 만들어거 보내고, 반대로 받은 패킷을 게임데이터로 역직렬화하는 작업을 한다.
    • 신뢰성 및 순서 보장
      • 네트워크는 불안정하기 때문에, 패킷이 유실되거나 순서가 뒤바뀔 수 있다. NetDriver는 중요한 패킷이 반드시 전달되고 올바른 순서로 처리되도록 관리하는 기능을 제공한다.
    • 대역폭 관리
      • 네트워크 트래픽을 효율적으로 관리하고, 대역폭 한도를 준수하는 역할도 한다.
  • ENetMode와의 관계
    • ENetMode에 따라 UNetDriver의 동작 방식과 내부 구조가 달라진다. 클라이언트 NetDriver는 하나의 UNetConnection만 관리하지만, 서버 NetDriver는 여러 UNetConnection을 관리한다.

'언리얼엔진5 공부' 카테고리의 다른 글

Property Replication  (1) 2025.11.20
RPC(Remote Procedure Call)  (0) 2025.11.19
디버깅  (0) 2025.11.17
CDO (Class Default Object)  (0) 2025.11.16
UObject  (0) 2025.11.14