Repository navigation
15_Development_History_Retrospective
Sonheim의 전투·포획·인벤토리 기능을 던전 콘텐츠까지 연결하면서 수정한 구조를 정리했습니다. 각 변경의 구현 근거는 당시 커밋과 현재 코드에서 확인할 수 있습니다.
| 시기 | 변경 내용 | 코드·커밋 |
|---|---|---|
| 2025.06 | Pal 보유 기록과 포획·소환 실행 분리 | Pal 컴포넌트 분리 |
| 2025.09 | 스킬 사용 권한(Grant)·실행 객체·복제 상태 구분 | 서버 스킬/Grant 정리 |
| 2025.09 | 인벤토리·보관함 슬롯의 FastArray 도입 | 슬롯 복제 변경 |
| 2026.09 | 이벤트 기반 던전 Runtime과 Stage Definition | 던전 Runtime 통합 |
| 2026.09 | 장벽 통제 조건을 Actor에서 Stage Definition으로 이동 | SealedBarriers 변경 |
| 2026.10 | 던전 알림을 다른 콘텐츠와 같은 Notice로 통합 | 공용 Notice |
포획한 Pal 목록은 현재 조작 중인 Pawn보다 오래 유지해야 합니다. ASonheimPlayerState에 UPalInventoryComponent를 두고 OwnedPals·CurrentPalIndex를 관리하며, Pawn의 UPalCaptureComponent와 UPalPartnerSkillComponent는 포획 시도·소환·회수·스킬 사용을 실행합니다.
PlayerState
UPalInventoryComponent → 보유 목록 · 선택 슬롯
↓
Pawn의 Capture/PartnerSkill Component
↓
포획 판정 · 소환 · Partner 행동
ASonheimPlayer::InitializeByPlayerState에서 두 수명의 객체를 연결합니다. 포획에 성공한 몬스터는 새 Actor로 교체하지 않고 기존 ABaseMonster에 PartnerOwner를 설정해 행동을 전환합니다. 포획 조준 UI도 각 컴포넌트를 서로 직접 연결하기보다 Pawn을 통해 상태가 전달되도록 변경했습니다.
포획 조준 UI 의존성 변경 커밋 · 08. Pal Capture & Partner Lifecycle
장비 교체 시 여러 출처가 같은 SkillId를 부여할 수 있습니다. USonheimSkillComponent::ReplaceGrant는 GrantId·RefCount로 권한을 갱신하며, 부여 해제가 실행 UObject의 즉시 삭제를 뜻하지 않도록 관리합니다.
EnsureSkillInstance는 실제 실행에 필요한 UBaseSkill을 생성·재사용합니다. 서버에서 사용 가능 여부와 시전 동작을 결정하고, UI가 참고할 SkillSpecs는 FastArray로 전달합니다. 실행 객체가 가진 Phase·타겟 등의 프로퍼티는 별도 서브오브젝트 복제 경로를 사용합니다.
flowchart LR
I["무기·장비 변경"] --> G["ReplaceGrant<br/>GrantId / RefCount"]
G --> C["SonheimSkillComponent<br/>사용 가능 여부 · TryCast"]
C --> E["UBaseSkill<br/>실제 스킬 실행"]
C --> V["SkillSpecs<br/>시전·쿨타임 요약"]
E --> O["복제 서브오브젝트<br/>Phase·Target"]
스킬 정의·장비 선택 UI·애니메이션 Notify·타격 실행이 한 객체에 모이지 않도록 역할을 나눈 변경입니다. 실제 시전 조건과 효과 판정은 서버 경로를 유지합니다.
스킬 서브오브젝트 변경 · 05. Combat, Skill & Animation
아이템 슬롯은 순서가 의미 있는 데이터입니다. 중간 삽입·삭제 시 후속 슬롯의 인덱스까지 바뀌기 때문에 단일 항목의 수량 변경과 배열 구조 변경을 구분했습니다.
FastArraySlotUtils로 슬롯 추가·이동·삭제 시 인덱스 보정과 Dirty 표시를 공통화합니다. 서버의 InventoryItems는 복제용 FRepInventoryList를 통해 OwnerOnly로 전달하고, 클라이언트에서는 슬롯 인덱스 순서로 로컬 배열을 다시 구성한 뒤 OnInventoryChanged를 호출합니다.
공유 Container도 FastArray를 사용하지만, Subscribers가 하나 이상일 때 RepContainerItems 복제를 활성화합니다. 이는 구독자별 독립 필터링이 아닌 프로퍼티 단위 활성화입니다.
인벤토리에서 무기를 선택하면 장비 표시만 변경하는 것이 아니라 활성 무기의 스탯 보너스와 ReplaceGrant도 함께 갱신합니다. 따라서 슬롯 변경은 게임플레이 상태를 수정하는 API를 거치고, Widget은 변경된 결과를 다시 표시합니다.
07. Inventory & Crafting · 12. Multiplayer Synchronization
Forgotten Ruins를 구현할 때 월드의 레버·입구·장벽이 Stage 분기 규칙을 직접 판단하지 않도록 변경했습니다.
레버는 기존 IInteractableInterface로 ActorInteracted + SourceId를 전달합니다. UDungeonStageRuntimeSubsystem은 해당 EventRule의 Action을 실행하고, Wave 완료 시점에 RunTag 조건을 평가해 지름길/추가 웨이브를 결정합니다.
장벽도 자신의 Stage를 직접 판단하지 않습니다. Stage의 SealedBarriers를 GameState Snapshot에 포함하고, ADungeonBarrier는 자신의 BarrierId가 현재 닫힌 목록에 있는지만 확인해 충돌·표시를 전환합니다.
DungeonDefinition (Event / Action / Transition · SealedBarriers)
↓
DungeonStageRuntimeSubsystem
↓ 현재 Stage / 닫힌 Barrier ID
GameState Snapshot
↓
ADungeonBarrier → 실제 통로 표시·충돌
분기와 차단 대상은 콘텐츠 데이터에서 정하고, 월드 Actor는 상호작용 입력이나 상태 표현을 맡도록 조정한 사례입니다. Stage·Group·Branch·Barrier 식별자는 Dungeon 하위 GameplayTag로 정리했고, 별도의 DungeonNumber는 저장 기록 키로 사용합니다.
09. Branching Dungeon Runtime · 13. Content Authoring & Validation
던전 UI는 한 화면에서 스테이지·목표·파티 HP·타이머·보스 행동·결과를 함께 표시합니다. UDungeonStagePresenter가 GameState Snapshot, UDungeonPresentationDataAsset, 개별 UHealthComponent를 읽어 FDungeonStageViewData로 변환합니다. UDungeonUIRouterSubsystem은 HUD와 결과 위젯을 교체하거나 다시 열 때 현재 ViewData를 적용합니다.
던전 전용 알림은 이후 UNoticeSubsystem으로 이동했습니다. 퀘스트·도감·레벨업도 같은 FNoticeData와 슬롯 정책을 사용하며, 던전 종료 시 Dungeon 채널만 정리합니다. 알림은 한 번 표시하고 사라지는 피드백이며 실제 진행 상태를 보관하지 않습니다.
11. Client State Presentation · 18. UMG v2
Stage마다 설정값이 올바르더라도 전환을 연결하면 실행할 수 없는 경로가 생길 수 있습니다. UDungeonDefinitionDataAsset::ValidateDefinition은 누락 Stage·순환·도달 불가능·Always 조건에 가려진 분기·SpawnGroup 생산 경로를 검사합니다.
보스 UBossPatternDataAsset::Validate는 경고 시작과 타격 사이 시간, Montage Section 및 Leap·Charge 설정 간 관계를 검사합니다. 이 결과를 Unreal Data Validation으로 표시하고, Stage Graph는 Definition에서 Mermaid로 추출합니다.
이 기술 문서는 프로젝트의 상세 구현을 다루는 '심층 분석' 자료입니다. README에서 생긴 궁금증을 이곳에서 코드를 통해 확인해 보세요.
| 문서 | 역할 | 내용 |
|---|---|---|
| 📋 Project Gallery | Root (전체 개요) | 주요 프로젝트 목록, 핵심 역량 요약 |
| 📁 Repository README | What (개요) | 프로젝트 목표, 데모 영상, 핵심 기능, 아키텍처 |
| 🔗 Tech Docs | How & Why (상세 구현) | 코드 분석, 설계 과정, 기술 회고, 트러블슈팅 |
- 04. Player & Character Systems
- 05. Combat, Skill & Animation
- 06. World Interaction Systems
- 07. Inventory & Crafting
- 08. Pal Capture & Partner Lifecycle
- 16. MonsterDex System
- 17. Quest System
- 19. World Map & Fast Travel