Unreal 게임 개발 과정 TIL

Today's I Learning

본캠프 TIL

07.30 Unreal 본캠프) 언리얼 엔진 네트워크 기초

Sunlight__ 2026. 7. 30. 23:23

📌 오늘 배운 핵심 요약 (Summary)

언리얼 엔진의 복잡한 네트워크 통신 구조를 '우체국(통신국)', '전화선', '족보'라는 개념으로 시각화하여 이해했다. 멀티플레이 서버가 개방되는 원리와 통신 권한(소유권)이 어떻게 작동하는지 파악하고, 멀티플레이 개발을 돕는 커스텀 유틸리티 클래스를 분석했다.

🛠️ 주요 학습 내용

1. 📡 UNetDriver와 UNetConnection (우체국과 직통 전화선)

언리얼의 네트워크 통신은 '우체국 본부'와 '직통 전화선'의 개념으로 작동한다.

  • UNetDriver (우체국 본부): 네트워크 통신의 로우레벨(밑단) 작업을 모두 알아서 처리해 주는 총괄 관리자다.
  • UNetConnection (직통 전화선): 서버와 클라이언트를 1:1로 이어주는 전용 통신 객체다.
    • 클라이언트의 방: 서버와 연락할 단 1대의 ServerConnection만 존재한다. (유저끼리는 직접 연결되지 않는다.)
    • 서버의 방: 접속한 유저의 수만큼 ClientConnection을 보유하고 관리한다. (유저가 100명이면 서버의 책상 위에는 100대의 전화기가 놓인다.)

2. 👨‍👦 소유권(Ownership)과 패밀리(Family)

게임 속 수많은 액터 중 "누가 서버와 통신할 권한을 가졌는가?"를 결정하는 핵심 개념이 바로 소유권, 즉 '족보'다.

  • 족보의 계층 구조 (패밀리): ClientConnection (전화선/할아버지) ➔ PlayerController (조종기/아버지) ➔ Pawn (캐릭터/아들) ➔ Weapon (무기/손자)
  • RPC(네트워크 통신)와의 관계: 말단에 있는 무기가 서버에 "공격했다"고 보고(RPC)하려면 전화기가 필요하다. 이때 GetNetConnection() 함수를 호출해 족보를 거슬러 올라가 할아버지의 전화기를 빌려 통신한다.
  • 무기를 버리면 일어나는 일: 땅에 무기를 버리는 순간 SetOwner(nullptr)가 되어 족보에서 파인다. 전화기를 쓸 수 없으므로 직접 서버와 통신할 권한을 완전히 잃고, 서버가 직접 관리하는 공공재 상태가 된다. 이후 다른 유저가 주우면 그 유저의 족보로 새롭게 입양된다.

3. 🌍 멀티플레이 서버 개방 원리와 UWorld::Listen()

싱글플레이 게임에서는 남과 통신할 필요가 없으므로 UNetDriver가 아예 생성되지 않지만, 멀티플레이를 시작할 때는 특별한 과정이 일어난다.

  • 멀티플레이를 시작하면 게임 세상(UWorld, 촌장님)이 UWorld::Listen() 함수를 실행해 외부 접속을 받을 준비를 한다.
  • 실제 엔진 C++ 코드를 뜯어보면, UWorld가 엔진 총괄(GEngine, 조물주)에게 NAME_GameNetDriver라는 이름의 통신국(우체국) 건물을 지어달라고 요청하고, 완성된 건물을 마을의 공식 통신국(NetDriver)으로 장부에 등록하는 과정을 거친다.

4. 🧰 멀티플레이용 커스텀 유틸리티 (ChatXFunctionLibrary)

멀티플레이 게임 개발 시 "이 코드가 서버에서 도는지, 클라이언트에서 도는지"를 쉽게 파악하기 위해 만든 static 공용 도구함 코드를 분석했다.

  • static 클래스와 함수: 객체(건물)를 메모리에 따로 짓지 않고도, 언제 어디서든 허공에서 바로 소환해 꺼내 쓸 수 있는 만능 공구함 역할을 한다.
  • MyPrintString (스마트 출력기):
    • 화면(모니터)이 있는 클라이언트(NM_Client)나 방장 유저(NM_ListenServer)에게는 화면에 글씨를 띄워준다.
    • 화면이 없는 데디케이티드 서버(얼굴 없는 심판)일 경우, 에러를 띄우는 대신 서버의 비밀 장부(UE_LOG)에만 텍스트를 기록하도록 분기 처리한 똑똑한 함수다.
  • GetNetModeString (명찰 발급기): 엔진이 사용하는 기계적인 신분 기호(ENetMode)를 확인하여, 사람의 언어인 "Client", "StandAlone", "Server" 같은 예쁜 문자열(FString) 명찰로 변환해 주는 번역기다.

🧠 오늘의 회고 (Reflection)

  • 배운 점: 길고 복잡해 보이는 C++ 엔진 코드나 공식 문서의 설명도, 구조(우체국, 전화기, 족보)를 머릿속에 시각화하고 읽으면 결국 '당연한 규칙들을 코드로 써놓은 것'에 불과하다는 것을 깨달았다.