오늘 할 일
- Hp 0일 시에 사망 처리 붙이기
- 사망 Overlay UI 추가
- 로딩 후 이전 저장 지점에서 부활처리
- 부활 애니메이션 추가
Death Flow 작업 계획
목표
HP가 0이 된 순간부터 사망 액션, 디졸브, 사망 오버레이, 로딩 초기화, 마지막 저장 위치 부활까지 이어지는 흐름을 단계적으로 구현한다.
사망 처리는 여러 시스템을 가로지르므로, 각 단계의 책임을 작게 나누고 이벤트 계약을 먼저 고정한다.
현재 확인된 기반
UMVStatComponent는 HP가 0 이하가 될 때OnDead이벤트를 발행한다.UMVActionComponent는FDataTableRowHandle을 받아 액션 row의 몽타주를 재생한다.UMVHitReactionComponent는 피격 상황별 row handle을 선택하고UMVActionComponent에 실행을 위임한다.UMVDeathOverlayWindow와UMVLoadingWindow클래스는 존재한다.- 사망 이벤트에는 마지막 피격 문맥이 포함되어 있지 않다.
- 사망 중 look을 제외한 입력 제한 정책은 아직 없다.
- 사망 액션 row 선택과 디졸브 notify는 아직 없다.
- 로딩 초기화 진행률, 도움말 카드, 필드 리셋 정책은 아직 없다.
UI 흐름
사망 UI는 사망 액션의 타이밍을 직접 결정하지 않는다. UI는 표시 책임만 갖고, 사망 진행 상태 전환은 이후 DeathFlow 또는 Respawn 계열 subsystem이 담당한다.
DeathOverlayWindow
- 고정 문구
YOU DIED를 창 내부에 표시한다. - 문구는 항상 동일하므로 DataTable로 관리하지 않는다.
- 단, 로컬라이징 수집을 고려해
NSLOCTEXT기반FText로 둔다. - Death overlay는 이동 입력을 막되 look 입력은 막지 않는다.
- Death overlay는 타이머가 끝났다는 이유만으로
LoadingWindow를 직접 열지 않는다. - 디졸브 시작 notify에서
UMVUISubsystem::ShowDeathOverlay()를 호출한다. - 사망 몽타주 종료 이벤트에서 death flow가
UMVUISubsystem::ShowLoadingWindow()를 호출한다.
LoadingWindow
- 로딩 진행률을 표시하는 progress bar를 가진다.
- 도움말 카드/캐러셀을 표시한다.
- 상호작용 키로 다음 카드를 넘길 수 있다.
- 초기화 완료 전에는 닫히거나 게임 입력으로 복귀하지 않는다.
- 진행률이 100%가 되면 death flow가 부활 단계로 넘어간다.
Loading 카드 테이블
로딩 카드 내용은 여러 문구가 필요하고 로컬라이징 대상이므로 DataTable로 관리한다.
FMVLoadingCardRow
CardId: 카드 식별자이자 row key.Title: 카드 제목.FText.Body: 카드 본문.FText, multiline.ContextTags: 특정 필드, 보스, 시스템 문맥에 맞춘 필터 태그.Priority: 같은 조건에서 먼저 보여줄 카드 우선순위.Weight: 무작위 선택 가중치.bEnabled: 비활성 카드 필터링.
MaverickDesign/Json/SheetRecipe.json에는 LoadingCard: CardId를 등록한다.
월드 상태와 필드 초기화 구조
필드 상태 초기화는 별도 FieldStateSubsystem을 만들지 않고 UMVWorldStateSubsystem에 저장되어야 하는 상태만 요청한다. 월드 안의 실제 액터 복원은 이후 각 액터/컴포넌트가 WorldState를 조회해 적용하는 구조로 확장한다.
WorldStateSubsystem 책임
- 마지막 저장 지점과 부활 transform을 저장한다.
- 세이브 슬롯 저장/로드를 담당한다.
- 1회성 몬스터/아이템 소비 상태를 저장한다.
- 숏컷, 열린 문, 보스 처치 같은 영구 월드 플래그를 저장한다.
- 퀘스트 진행 상태를 저장하되, QuestSubsystem은 WorldState에 요청만 한다.
QuestSubsystem 책임
- 퀘스트 상태 전환, 목표 카운트 변경, 완료 처리 요청을 받는다.
- 퀘스트 데이터 저장이 필요하면
UMVWorldStateSubsystemAPI를 호출한다. - 퀘스트 전용 규칙은 QuestSubsystem에 두고, 저장 포맷은 WorldState에 집중한다.
RespawnSubsystem 책임
- 사망 상태 진입부터 로딩, 부활까지의 상태 머신을 소유한다.
- LoadingWindow progress에 연결될 진행률 이벤트를 발행한다.
- 마지막 체크포인트 조회와 플레이어 부활 처리를 위해 WorldState에 요청한다.
- 필드 액터 리셋이 구현되기 전까지 사망 리셋 단계의 자리와 이벤트 계약을 제공한다.
Spawn/Reset 정책
RespawnEveryDeath: 일반 몬스터, 일반 소모성 필드 오브젝트. 사망 리셋 때 다시 생성하거나 초기 상태로 복원한다.PersistIfConsumed: 1회성 아이템, 1회성 몬스터. 이미 획득/처치했다면 다시 생성하지 않는다.PersistState: 숏컷, 열린 문, 보스 처치 상태처럼 저장 이후 유지되어야 하는 상태.TransientOnly: 투사체, 임시 소환물, 이펙트. 리셋 때 제거만 하고 재생성하지 않는다.
사망 리셋 단계
- 플레이어 입력과 전투 처리를 정지한다.
- 임시 액터와 투사체를 제거한다.
- 일반 몬스터/아이템을 초기 상태로 되돌린다.
- 1회성 몬스터/아이템의 소비 상태를 저장 데이터에서 확인한다.
- 숏컷/문/보스 처치처럼 보존 상태를 재적용한다.
- 플레이어를 마지막 저장 위치로 이동 또는 재스폰한다.
- HP/스태미너/MP 등 스탯을 부활 기준으로 초기화한다.
- 부활 몽타주를 재생한다.
- 현재 필드 이름 알림 위젯을 표시했다가 숨긴다.
구현 순서
- Death flow 문서화.
- DeathOverlayWindow가 고정 문구를 표시하고 LoadingWindow 전환 책임을 내려놓게 수정한다.
- Loading 카드 DataTable row 구조와 recipe를 추가한다.
UMVStatComponent사망 이벤트에 dead state와 사망 문맥을 추가한다.- 사망 중 look 외 입력 차단 게이트를 추가한다.
UMVHitReactionComponent가 사망 이벤트로 death row를 선택해UMVActionComponent에 전달하게 한다.- 사망 디졸브 notify와 dissolve component를 추가한다.
UMVWorldStateSubsystem저장/로드 골격을 추가한다.UMVRespawnSubsystem골격을 추가한다.UMVQuestSubsystem이 WorldState에 요청하는 구조를 추가한다.- LoadingWindow progress API를 추가한다.
- LoadingWindow card UI를 구현한다.