게임 개발/학습 일지

언리얼 내배캠 - 언리얼 멀티플레이 기초 NetMode, NetConnection, NetDriver

이개 2026. 6. 17. 10:03
NetMode
  • 해당 게임 프로세스가 네트워크 상에서 어떤 역할을 하고 있는지를 의미
  • 싱글(NM_StandAlone), 서버(NM_Listen, NM_DedicatedServer), 클라이언트(NM_Client)
 
NetMode의 필요성
  • 작성 중인 로직이 서버에서 도는지 클라이언트에서 돌고 있는지는 알아야할 때
  • 멀티플레이 시에 가장 큰 걸림돌은 같은 코드가 여러 PC에서 동작한다는 것

  • 디버깅을 할 때 어떤 PC에서 동작중인지를 살펴보아야한다.
  • NetMode는 월드 클래스의 속성값, NetRole은 액터의 속성값이라고 보면 된다.
 
UWorld::InternalGetNetMode() 함수
NetDriver가 NULL이 아니면 클라이언트나 서버 중 하나다.
 
GetNetMode에서는 IsServer로 서버 여부를 먼저 판단하고, 클라이언트이자 서버면 리슨서버, 아니면 데디서버로 나눈다.
 
IsServer에서는 ServerConnection이 없다면 클라이언트로 판단한다.
 
NetConnection이란?
  • 다른 PC와의 연결이 발생하면 그에 대응하는 UNetConnection 객체가 생성됨
  • 클라이언트가 접속하면 서버에는 ClientConnection객체, 클라이언트에는 ServerConnection 객체가 생성됨
  • 두 PC는 UNetConnection 객체를 통해 통신
  • UNetDriver는 생성된 UNetConnection 객체를 소유하고 관리
  • 서버 PC에 생성된 UNetDriver는 접속한 클라이언트의 수만큼 UNetConnection을 관리
  • 클라이언트 PC에 생성된 UNetDriver는 ServerConnection 하나만 관리
  • NetConnection은 PlayerController를 소유
 
클라이언트끼리의 통신은 불가능하고, 오직 서버와 클라이언트 사이의 통신만 가능하다.
 
NetDriver 구성요소
ServerClient는 하나고 ClientConnections는 복수형인 것을 알 수 있다.
NetDriver는 멀티플레이를 하기 위해서는 연결된 모든 디바이스에서 필수적으로 실행되어야한다. 오너가 서버인지 클라이언트에 따라 ClientConnections 데이터를 가지고 있는지, ServerClient 데이터를 가지고 있는지가 다르다.
 
 
멀티플레이어에서의 OwnerShip
  • 하나의 ClientConnection은 하나의 PlayerController를 소유
  • PlayerController의 Owning Connection은 ClientConnection인 셈
  • PlayerController가 빙의하는 Pawn의 Owner 속성은 해당 PlayerController로 설정됨
  • 폰에 무기 액터가 생성되고, 무기 액터의 Owner 속성에 해당 폰을 설정할 수 있음
  • ClientConnection에서부터 무기 액에터 이르는 소유관계를 패밀리라고도 부름
  • 소유 관계 속 액터가 본인의 Owing Connection을 얻으려면 AActor::GetNetConnection() 함수를 호출하면 된다.
 
NetDriver란?
  • 언리얼 네트워크 통신에서 로우레벨 동작들을 관리하는 클래스
  • 싱글 플레이에서는 생성되지 않음
  • 멀티플레이에서만 UWorld::Listen()함수를 통해 UNetDriver 객체가 생성됨
  • 멀티플레이에 참여하는 각 PC마다 생성됨
 
멀티플레이용 디버깅로그 작성하기
 
데디서버는 뷰포트가 필요없다.

 

위와 같이 로그 코드를 추가하고 클라이언트에서 메시지를 치면 클라이언트로 나온다.
 
플레이어 수 1, 넷모드는 Standalone으로 변경한다.
if (IsLocalController() == false)
{
return;
}
이 부분을 빼고 코드를 추가 수정하면 StandAlone인지 알 수 있다.
 
로깅할 때 이런 식으로 어느 쪽에서 작동하는지를 표시해주어야한다.
 
StandAlone
  • 게임이 원격 클라이언트의 연결을 허용하지 않는 서버로 실행 중
  • 커넥션 없음
  • 모든 플레이어는 로컬 플레이어
  • 싱글 및 로컬 플레이에 사용
  • 로컬 플레이어에 맞게 서버측 로직과 클라이언트축 로직을 모두 실행
Client
  • 게임이 네트워크 멀티플레이 세션에 서 서버에 연결된 클라이언트로 실행됨
  • 서버 측 로직을 실행하지 않음
  • 서버로부터 복제된 Proxy만 보여주는 역할을 함
Listen 서버
  • 게임이 네트워크 멀티플레이어 세션을 호스팅하는 서버로 실행 중
  • 원격 클라이언트의 연결을 수락하고 로컬 플레이어를 서버에 직접 배치
  • 서버 자신도 게임에 참여
Dedicated Server
  • 게임이 네트워크 멀티플레이 세션을 호스팅하는 서버로 실행됨
  • 로컬 플레이어가 없음
  • 그래픽, 사운드 등 플레이어 중심 기능 삭제
 
서버에만 존재하는 액터
  • 게임모드
서버와 모든 클라이언트에 존재하는 액터
  • 배경 액터와 폰
서버와 클라이언트에만 존재하는 액터
  • 플레이어 컨트롤러
클라이언트에만 존재하는 언리얼 오브젝트
  • 애니메이션 블루프린트, UI
 
클라이언트에서 GameMode를 호출하면 nullptr이 반환된다. 그래서 GameMode에 접근하려면 Server RPC 함수 내에서 접근하거나, 서버에서도 수행되는 함수 내에서 HasAuthority() 함수로 서버임을 확인하고 접근한다.