Ch3 팀 프로젝트(9) - Raid End Transition(2)

yys·2026년 5월 26일

TIL

목록 보기
52/79

위젯 제작


레퍼런스는 배틀필드 6의 엔딩 스크린으로 삼았고 이를 변형하는 형태로 제작하려고 한다.

먼저 결과만 보여주자면 다음과 같이 동작한다.

WBP_PDRaidEndTransitionWidget 은 C++ UPDRaidEndTransitionWidget을 상속한다. C++ 쪽에서 BindWidget / BindWidgetOptional 로 위젯 핸들만 잡아두고, 실제 레이아웃·디자인은 WBP에서 구성하는 구조다.

  • 필수 바인드 : Text_Main, Text_Subtitle, Box_PlayerEntries
  • 선택 바인드 : Text_RaidDuration, Text_ContinuePrompt
  • 애니메이션 바인드 : Anim_IntroSequence, Anim_BlackFade

결산 한 줄(Box_PlayerEntries 안에 들어가는 행)은 별도 위젯 WBP_PDPlayerRaidEntry 로 분리했다. 위젯을 BP에서 직접 채우지 않고, C++ Configure 가 EntryWidgetClass 로 CreateWidget 해서 VerticalBox에 add 하는 방식이다.

  • 행 위젯에는 플레이어명/생존상태/킬·골드·아이템/생존시간/ACK 표시용 텍스트박스가 들어가고,
  • 행마다 자체 Anim_Reveal 을 가져 부모가 인덱스만큼 지연시켜 순차적으로 켜준다.

WBP에는 역할이 다른 3개의 위젯 애니메이션이 있다.

1. Anim_IntroSequence — 시네마틱 조립

가장 핵심이 되는 진입 연출. 여러 트랙이 시간차를 두고 겹쳐 들어오면서 배지가 조립되는 인상을 만든다.

  • 0.2s~ 비네트 세피아가 먼저 깔리고
  • 0.5s~ 스캔라인(Top/Bottom)이 훑고 지나가며
  • 1.0s~ 셀 그리드(UGP_Cells)가 채워지고
  • 1.5s~ 애너모픽 플레어가 등장
  • 2.0s~ 메인 텍스트 → 서브타이틀 → 언더라인이 순차 등장
  • 시퀀스 후반(~3.5s)의 PlaySummaryReveal 이벤트 트랙 이 C++ BeginEntryReveals() 를 호출 → 결산 핸들이 페이드인을 시작한다.

결산 행 reveal을 인트로 시퀀스 안의 이벤트 트랙으로 트리거하는 게 핵심이다. BP가 이 노티파이를 연결하지 않으면 행들은 의도적으로 영원히 보이지 않는다.

2. Anim_LayoutReveal — 결산 패널 펼침

결산 영역 자체의 레이아웃을 펼치는 애니메이션

  • HB_ColumnHeader 의 Render Opacity (컬럼 헤더 페이드인)

  • Sizer_PlayerEntries 의 Height Override (높이를 0→실제값으로 늘려 박스를 펼침)

  • Text_RaidDuration 의 Render Opacity (레이드 소요 시간 페이드인)

    약 1초에 걸쳐 헤더·시간이 켜지고 행 컨테이너가 높이를 확보하면서 열린다.

3. Anim_BlackFade — 퇴장/트래블

Image_BlackFade 의 Render Opacity 만 0→1로 올리는 짧은(~0.4s) 페이드. 좌클릭으로 결산을 닫을 때 화면을 검게 덮고, 애니메이션 끝의 노티파이가 HandleTravelTrigger() → Server_RequestBaseTravel() 을 호출해 베이스로 트래블한다.

런타임 흐름


C++과 WBP가 주고받는 전체 시퀀스는 다음과 같다.

GameMode::OnRaidEnded
PushToLayer + Configure(bSuccess, Entries, RaidDuration)
Configure() : 텍스트/시간 세팅, 행 위젯 CreateWidget, ApplyAccent(색상)
NativeOnActivated() : Anim_IntroSequence 재생
├ [Notify: PlaySummaryReveal] → BeginEntryReveals() : 행마다 PlayRevealAfter(Index × StaggerInterval)
└ [Notify: Intro 끝] → OnIntroFinished() : 입력 가드 해제(bReadyForInput) + ContinuePrompt 노출
→ [좌클릭] NativeOnMouseButtonDown : bReadyForInput 일 때만 소비
Anim_BlackFade 재생
└ [Notify: BlackFade 끝] → HandleTravelTrigger()PDPlayerController::Server_RequestBaseTravel()

  • 입력 게이팅 : 인트로가 끝나기 전(bReadyForInput == false) 좌클릭은 무시된다. 연출 도중 스킵을 막아 결산을 끝까지 보게 한다.
  • 애니메이션 부재 안전망 : Anim_IntroSequence 가 없으면 곧장 OnIntroFinished(), Anim_BlackFade 가 없으면 곧장 HandleTravelTrigger() 로 빠져 흐름이 멈추지 않는다.
  • stagger reveal : 행 reveal 은 인트로 시퀀스 길이와 독립적으로, 행 개수 × EntryStaggerInterval(0.8s) 만큼 순차적으로 켜진다.

이렇게 C++은 데이터 주입·입력 게이팅·트래블 트리거 같은 로직만 쥐고, 시각 연출은 전부 WBP 애니메이션 트랙과 노티파이로 위임하는 구조로 결산 전환을 구성했다.

profile
게임 개발 지망생

0개의 댓글