[UE5] 익스트랙션 슈터 개발 기록: 프로젝트 소개
카테고리: DevLog
태그: C++, Multiplayer, UE5
📌 이 시리즈의 표지입니다. 개별 개발 기록은 DevLog 카테고리에서 날짜순으로 볼 수 있습니다.
완성된 시스템만 보려면 프로젝트 소개 페이지가 더 빠릅니다.
👾 깃허브
📋 기획
EmploymentProj
UE5 C++ 멀티플레이어 익스트랙션 슈터. 템플릿, 블루프린트 없이 C++로 바닥부터 설계했다.
프로젝트 소개
채용공고의 필수/우대 요건을 주장이 아니라 동작하는 시스템으로 증명하는 프로젝트다. “무슨 클래스를 썼다”가 아니라 어떤 판단을 내렸고 왜 그렇게 했는지를 표 오른쪽 칸에 적었다.
필수요건
| 요구사항 | 이 프로젝트에서 내린 판단 | 글 |
|---|---|---|
| UE Gameplay Framework 이해 | 매치 상태를 AGameMode 내장 상태머신에 얹고, 클라가 알아야 할 것만 GameState로 승격 |
1-1, 1-3 |
| 게임모드 및 기믹 개발 | ChoosePlayerStart 오버라이드로 중복 없는 랜덤 스폰, 매치 타이머로 EndMatch 트리거 |
1-3, 1-4 |
| Replication 기반 네트워크 개발 | Sprint를 Server RPC에서 CMC CompressedFlags로 이관, RPC와 복제 변수를 없애고 기존 플래그 바이트의 빈 비트로 대체 | 2-1 |
| 서버-클라이언트 동기화 이해 | 히트 판정 전량 서버 권한 + 본 단위 히트박스 리와인드, 시계는 GetServerWorldTimeSeconds()로 통일 |
3-1~3-3 |
| C++ 심층 이해 | CMC SavedMove 확장, FObjectInitializer로 기본 서브오브젝트 교체, FBodyInstance 직접 조작 |
2-1, 3-2 |
우대요건
| 요구사항 | 이 프로젝트에서 한 것 |
|---|---|
| 서버 권한 아키텍처 | 전 게임 로직 서버 판정. 클라는 요청과 표현만 담당 |
| GAS 활용 | AttributeSet(Health/MaxHealth/MoveSpeedMultiplier), GameplayEffect 데미지 파이프라인, 어빌리티 7종: Skill 3종(Dash/Heal/ShieldOn) + Death / Interact / Item_PrimaryUse / Item_Reload |
| Data-Driven 설계 | 3계층 구조, FEPItemData(DataTable Row) → UEPItemDefinition(DataAsset) → 런타임 상태. ItemId로 연결 |
| 버전 관리 | 단계별 feature 브랜치(feature-gas, feature-loot), 단계 완료 시 태그(step5-2) |
검증 범위를 분명히 해둔다. 설계 목표는 2~8인이지만 실제로 확인한 것은 PIE 다중 클라이언트 2인 동시 접속까지다. 데디케이티드 서버 타깃(
*Server.Target.cs)은 아직 분리하지 않았고, Listen Server 구성으로 서버 권한 경로를 검증했다.
게임 컨셉
“취업”을 테마로 한 1인칭 익스트랙션 슈터.
flowchart LR
A[매치 시작] --> B[랜덤 스폰]
B --> C[파밍: 루팅 + 자판기]
C --> D[교전: PvP/AI]
D --> E[탈출]
E --> F[보상]
- 자판기: 돈 투입 → 5초 대기(소리로 위치 노출) → 확률 아이템 배출
- 퀘스트 아이템(이력서, 자격증 등)을 모두 수집하면 “취업 성공”
- 사망 시 소지품 전부 손실, 탈출 성공 시 보존
타르코프를 참고했고, 그래서 정보 은폐가 설계의 축이다. 남은 플레이어 수, 상대 HP, 내 킬 수는 전부 공개하지 않는다. 이 결정이 복제 조건(COND_OwnerOnly) 선택으로 그대로 이어진다. → 이 게임의 복제 설계 전부
참고
기술 스택
| 엔진 | Unreal Engine 5.7 |
| 언어 | C++ (게임플레이 로직 100%) |
| 네트워크 | 서버 권한 모델, UCharacterMovementComponent 예측 확장 |
| 빌드 | MSVC (Visual Studio Build Tools 2022) |
| IDE | JetBrains Rider |
| 버전 관리 | Git, 단계별 feature 브랜치 + 완료 태그 |
프로젝트 구조
UE5-EmploymentProj/
├── CLAUDE.md
├── README.md
├── DOCS/
│ ├── DOCS.md # 기술 로드맵 (채용공고 요건 → 구현 매핑)
│ ├── GAME.md # 게임 디자인 문서
│ ├── Mine/ # 주제별 설계 노트 (TickGroup, Dormancy, …)
│ └── Notes/ # 단계별 구현서 + STATUS
│ ├── 01/ 02/ 03/ 04/ 05/
└── EmploymentProj/
└── Source/EmploymentProj/
├── Public/ # 기능별 분리 (Core/ Combat/ Movement/ GAS/ Data/ Loot/ …)
└── Private/ # Public 구조를 그대로 미러링
각 단계 폴더에는 구현서와 *_STATUS.md를 따로 둔다. 구현서는 예정을 적고, STATUS는 실제로 동작하는 것만 적는다. 진행 상태의 진실은 항상 STATUS 쪽이다.
빌드 명령어
# 프로젝트 파일 생성
UnrealBuildTool.exe -projectfiles \
-project="EmploymentProj/EmploymentProj.uproject" -game -engine
# Development Editor 빌드
UnrealBuildTool.exe EmploymentProj Win64 Development \
-project="EmploymentProj/EmploymentProj.uproject"
멀티플레이 확인은 에디터에서 Play → Net Mode: Play As Client, Number of Players: 2로 한다.
댓글남기기