← Portfolio

PROJECT CASE STUDY

BattleGround
HotDrop Mode

Unreal Engine 5와 Dedicated Server를 기반으로 PUBG의 핫드롭 흐름을 재구성한 멀티플레이 FPS 프로젝트입니다. 로비부터 전투, 결과 확인까지 서버 권한 중심의 게임 루프를 구현했습니다.

Unreal Engine 5C++Dedicated ServerReplication

PROJECT OVERVIEW

빠르게 착지하고, 즉시 교전하며, 끝까지 살아남는 핫드롭 전장

핫드롭은 넓은 전장을 오랫동안 탐색하는 기존 배틀로얄과 달리, 제한된 전장에 플레이어가 밀집해 빠르게 착지하고 루팅과 전투에 진입하는 모드입니다. 짧은 준비 시간과 빠르게 좁아지는 안전 구역을 통해 한 경기의 긴장감과 전투 경험을 압축합니다.

핫드롭 전장에 낙하산으로 진입하는 플레이어들
원작 레퍼런스 이미지

PUBG_HotMode는 이러한 핫드롭의 빠르고 밀도 높은 전투 경험을 Unreal Engine 5.7과 Dedicated Server 기반의 멀티플레이 구조로 재현한 프로젝트입니다. 전용 서버가 경기의 규칙과 상태를 관리하며, 클라이언트는 이를 바탕으로 원작의 핵심 플레이 경험을 재현하도록 구성했습니다.

MY CONTRIBUTION

Dedicated Server 기반의 접속·로비·매치 상태와 전투 진입·종료 흐름을 구현하고, HUD·사운드·콘텐츠 에셋까지 통합했습니다.

  • 전용 서버 접속·EntryMap·닉네임 입력 흐름
  • 로비 준비 상태와 플레이어 목록 동기화
  • 매치 상태·생존자 수·최종 순위 관리
  • 비행기·낙하산 진입과 카메라·사운드 연동
  • 서버 권위 기반 BlueZone 판정·데미지·Overlay
  • 사망·관전 대상 전환·결과 UI 파이프라인
  • CompassComponent와 커스텀 HUD 렌더링
  • Intro·로비 BGM·전투 사운드 및 입력 UX
  • 맵 아이템 배치·패키징 설정·멀티플레이 버그 안정화
  • MetaHuman 의상 에셋 통합과 캐릭터 외형 구성

01 / SERVER AUTHORITY

게임 흐름을 서버 권한으로 일관되게 관리

준비되지 않은 상태에서 경기가 시작될 수 있었습니다

로비에서 한 플레이어의 시작 요청만 처리하면, 다른 플레이어의 준비 상태가 반영되기 전에 전장으로 이동할 수 있었습니다. 이 경우 플레이어마다 서로 다른 상태로 경기에 진입하거나, 일부 플레이어가 로딩 과정에서 제외될 가능성이 있었습니다.

모든 플레이어가 경기에 참여할 준비가 되었는지 확인한 뒤 전환하도록 기준을 통일해, 참여자 전원이 동일한 상태에서 경기를 시작할 수 있도록 개선했습니다.

로비에서 플레이어 준비 상태를 확인하는 화면
로비 준비 상태와 게임 시작 대기 화면

맵 전환 과정에서 플레이 흐름이 끊길 수 있었습니다

로비에서 전장으로 이동하는 동안 기존 UI가 먼저 사라지고 새 맵이 완전히 로드되지 않으면, 화면이 비어 보이거나 입력 상태가 어긋날 수 있었습니다.

맵 전환 과정을 하나의 흐름으로 관리해, 이동 중에는 로딩 상태를 보여주고 전장 진입이 완료되면 게임 입력으로 자연스럽게 전환되도록 개선했습니다.

그 결과 로비의 준비 상태와 맵 전환 과정을 서버 기준으로 일관되게 관리해, 플레이어가 예기치 않게 경기에 진입하거나 전환 과정에서 흐름을 잃는 문제를 줄일 수 있었습니다.

02 / MATCH FLOW

서버 기준으로 경기 흐름을 통제하고, 전투·관전·결과를 연결

경기 시작 시점과 비행 경로는 서버가 결정하고, 클라이언트는 전달받은 기준을 이용해 동일한 플레이어 진입 경험을 재현합니다. 이후 사망·관전·결과 상태도 서버 흐름에 맞춰 이어지도록 구성했습니다.

비행기에서 전장을 내려다보는 핫드롭 진입 화면
서버가 시작한 비행 경로를 따라 전장에 진입하는 장면

경기 시작과 낙하 상태를 하나의 흐름으로 연결

준비 페이즈의 카운트다운이 끝나면 서버가 전투 상태로 전환하고 비행기를 출발시킵니다. 플레이어의 낙하 입력은 RPC로 전달하며, 서버가 공중 이동과 낙하산 상태를 갱신한 뒤 착지 시 지상 이동으로 복귀시킵니다.

사망–관전–결과 화면 흐름

플레이어의 사망을 단순한 캐릭터 상태 변경으로 끝내지 않고, 생존자 수·순위·관전 대상·결과 화면을 갱신하는 경기 종료 파이프라인으로 연결했습니다.

플레이어 사망 후 관전 또는 게임 종료를 선택하는 결과 화면
플레이어 사망 후 관전·게임 종료로 이어지는 결과 화면

그 결과 사망 이후에도 관전과 결과 확인이 끊기지 않고 이어지며, 서버가 결정한 경기 상태를 모든 플레이어가 일관된 화면으로 확인할 수 있습니다.

03 / MULTIPLAYER STATE SYNC

요청은 RPC로, 상태는 Replication으로

멀티플레이 기능을 구현하며 모든 정보를 같은 방식으로 전달하지 않았습니다. 클라이언트의 입력이나 일회성 이벤트는 RPC로 서버에 전달하고, 준비 상태·매치 상태·생존자 수처럼 지속적으로 공유되어야 하는 정보는 Replication으로 관리했습니다.

RPC / 일회성 요청Ready 입력, 비행기 탈출, 로딩 화면 표시처럼 특정 시점에 발생하는 명령을 전달
Server Authority / 상태 검증서버가 요청의 유효성을 확인한 뒤 실제 게임 상태를 변경
Replication / 화면 동기화변경된 상태를 각 클라이언트에 복제하고 UI는 복제된 값을 기준으로 갱신

인벤토리 데이터 동기화 최적화

인벤토리에는 Fast Array Serializer를 적용해 전체 목록이 아닌 변경된 아이템만 전송하도록 구성했습니다. 아이템 추가·삭제·수정 항목만 동기화해 인벤토리 규모가 커져도 불필요한 네트워크 트래픽과 클라이언트 갱신 비용을 줄일 수 있었습니다.

인벤토리와 전투 HUD가 표시된 화면
인벤토리와 전투 HUD

04 / NETWORK PROFILING

실제 네트워크 흐름을 프로파일링으로 검증

RPC와 Replication의 동작을 코드만으로 확인하지 않고, Unreal Insights의 Networking Insights를 사용해 실제 전송 흐름을 추적했습니다. -NetTrace=1 -tracehost=localhost -trace=net 옵션으로 네트워크 데이터를 수집하고, 로비 Ready 요청과 복제된 상태가 서버와 클라이언트 사이에서 어떤 시점에 전달되는지 확인했습니다.

이를 통해 코드상 설계와 실제 실행 결과를 비교하고, 불필요한 호출이나 상태 갱신 시점을 검증할 수 있었습니다. 에디터 Standalone 환경에서 빠르게 확인한 뒤, 최종적으로는 패키징된 Dedicated Server 환경에서도 검증해야 한다는 점을 경험했습니다.

Unreal Insights Networking Insights 프로파일링 화면
Unreal Insights Networking Insights 프로파일링

Networking Insights 사용 기록

RESULT & GROWTH

멀티플레이 시스템을 설계하며 배운 것

01 / 분산 환경

분산된 상태를 기준으로 사고하는 법

로컬에서는 정상적으로 동작하던 기능도 서버와 클라이언트의 시점과 권한이 달라지면 다른 결과가 발생했습니다. 단일 실행 흐름이 아닌 분산된 환경을 전제로 시스템을 설계하는 법을 익혔습니다.

02 / 동기화 구조

동기화 문제를 구조적으로 해결하는 법

입력과 상태, 화면이 서로 다른 시점에 갱신되며 상태 불일치와 전환 오류를 경험했습니다. 임시 예외 처리보다 각 상태의 책임과 전환 기준을 분리해 문제를 해결하는 능력을 키웠습니다.

03 / 검증 과정

보이지 않는 문제를 검증하는 법

네트워크 문제는 발생 시점과 원인을 즉시 확인하기 어려웠습니다. 실행 흐름을 추적하고 실제 동작을 검증하며, 근거를 바탕으로 문제를 분석하고 개선하는 습관을 갖게 되었습니다.

PUBG_HotMode를 통해 서버와 클라이언트의 상태를 조율하고, 동기화 문제를 구조적으로 해결하며, 일관된 멀티플레이 경험을 설계하는 개발자로 성장할 수 있었습니다.

↑ 맨 위로