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() 함수로 서버임을 확인하고 접근한다.
'게임 개발 > 학습 일지' 카테고리의 다른 글
| 언리얼 내배캠 - 언리얼 멀티플레이 기초 RPC(Remote Procedue Call) (0) | 2026.06.19 |
|---|---|
| 언리얼 내배캠 - 언리얼 멀티플레이 기초 NetRole (0) | 2026.06.18 |
| 언리얼 내배캠 - 언리얼 멀티플레이 기초 실습 환경 설정 (0) | 2026.06.16 |
| 언리얼 내배캠 마스터반 - Subsystem 기반으로 아이템 매니저 만들기 (0) | 2026.06.15 |
| 언리얼 내배캠 마스터반 수업 - Subsystem과 수명 관리 (0) | 2026.06.10 |