한 줄 위젯 WBP_RankRow

순위 한 줄을 그리는 위젯

  1. WBP_RankRow 생성(User Widget)
  2. Horizontal Box를 하나 놓고 그 안에 Text Block 세 개를 나란히: 등수 / 이름 / 생존시간
  3. 세 Text Block을 각각 선택하고 오른쪽 Details 위쪽의 Is Variable 체크박스를 킴
  4. 이름은 알아보기 쉽게 정하기 (등수, 이름, 생존시간)
  5. Graph 탭으로 가서 이 줄에 데이터를 채우는 함수 생성
    이름 SetRowData
    입력 파라미터 3개:
    • InRank (Integer), InName (String), InTime (Float)
    • 함수 안에서: Text_Rank에 SetText(InRank를 ToText로), Text_Name에 InName, Text_Time에 InTime을 "~초 생존"으로 포맷해서 SetText
    • 시간 포맷은 Round(InTime) →->ToText(Int)
      variables는 이후에 한글로 변경함 등수 이름 생존시간으로

목록 컨테이너 WBP_Ranking

이게 실제로 GameState에 연결될 순위표

배열을 읽어서 위의 줄 위젯을 개수만큼 찍음

  1. WBP_Ranking 생성
    Designer에 Vertical Box 하나 놓고 Is Variable 켜서 이름 Box_RankList
    • Vertical Box는 자식을 세로로 쌓는 컨테이너
  2. Graph 탭에서 갱신 함수 RefreshRanking 생성
    이 함수가 하는 일 목록 비우고 -> 배열 순회하며 줄 찍기
    • Get Game State -> Cast to FDGameState -> Get HiderRankings 로 배열을 가져옴
    • 그 배열에 대고 For Each Loop를 걸기 (배열을 하나씩 훑는 반복 노드)
    • 루프 Body 안에서
      • Create Widget -> Class는 WBP_RankRow -> 방금 만든 줄 위젯 인스턴스 하나 생성
      • 그 위젯에 대고 SetRowData 호출 입력엔 Array Element에서 뽑은 값들을 연결
        • Array Element -> Rank -> InRank
        • Array Element -> Player Name -> InName
        • Array Element -> Survival Time -> InTime
      • 그 위젯을 Box_RankList -> Add Child로 세로 박스에 추가
  3. 목록 비우기 Box_RankList -> Clear Children
  4. RefreshRanking 두 군데서 부르기
    1. OnRankingsUpdated 방송에 바인딩 배열이 위젯보다 늦게 도착하는 경우 대비
    Get Game State -> Cast to FDGameState -> Bind Event to OnRankingsUpdated로 묶고 그 이벤트가 RefreshRanking를 부르게 함
    2. Event Construct에서 한 번 위젯이 뜰 때 이미 배열이 도착해 있으면 이 호출로 바로 그려짐

 

연결

  • BP_FDGameState ->  UI -> Ranking Widget Class에 WBP_Ranking 할당

이러면 C++의 UpdatePhaseUI가 GameOver phase에서 WBP_Ranking을 화면에 띄우고 그 위젯이 배열을 읽어 줄을 찍음

+ Recent posts