언리얼 UI 정리 (WidgetComponent, HUD, 초기화 타이밍 함정)
언리얼 UI 학습 노트. 강의 9.2/9.5 개념만. 위젯이 데이터와 연결 안 될 때 다시 보기.
UMG와 위젯 컴포넌트
언리얼 UI 모듈은 UMG(Build.cs에 추가). HP UI처럼 "캐릭터에 붙는 기능"은 WidgetComponent로 구현. 머리 위 HP Bar는 몬스터에 흔하므로 NPC에 부착.
UI 초기화 타이밍 함정 (이 챕터에서 가장 중요)
발행-구독으로 캐릭터 상태 변화를 UI에 연결할 때 타이밍이 꼬임:
- 액터 BeginPlay 이후에 위젯 컴포넌트의 InitWidget()이 호출됨
- InitWidget() 이후에야 소유 액터를 알 수 있음
- 그래서 UI의 CDO에서 미리 초기화할 수 없음
해결 흐름: InitWidget()에서 GetOwner로 소유 액터를 위젯에 세팅 → 위젯의 NativeConstruct에서 그 액터를 캐스팅해 SetHPTextWidget 호출 → 거기서 StatusComponent의 현재값으로 초기화 + OnCurrentHPChanged/OnMaxHPChanged 델리게이트에 위젯 함수 바인드.
핵심: "초기 1회 동기화 + 이후 델리게이트 구독"을 둘 다 해야 함. 델리게이트만 걸면 바인드 전에 이미 바뀐 값이 UI에 반영 안 됨.
또 다른 타이밍 함정(HUD): PlayerController::BeginPlay가 StatusComponent::BeginPlay보다 먼저 호출됨. 그래서 HUD에서 HP를 DataTable 초기값으로 먼저 채워두고, 이후 델리게이트로 실제 값 동기화.
WidgetComponent 표시 방식
- EWidgetSpace::Screen: 빌보드처럼 항상 화면 향함. 단 캐릭터를 가릴 수 있고 거리와 무관하게 같은 크기
- EWidgetSpace::World: 월드에 박힘. 거리에 따라 크기 변함
World로 두면 카메라를 안 봐서 어색 → Tick에서 위젯이 카메라를 바라보도록 FindLookAtRotation으로 회전 갱신. 콜리전은 NoCollision으로.
HUD와 BindWidget
HUD: 플레이어 정보(HP/KillCount 등)를 보여주는 화면 UI.
BindWidget 치트시트: UPROPERTY에 meta=(BindWidget) 붙이면 C++ 속성과 위젯 BP의 위젯이 하드코딩 없이 자동 연결. 단 C++ 속성 이름과 위젯 BP 안 위젯 이름이 정확히 같아야 함. 이름 안 맞으면 컴파일 시 위젯 BP에서 에러.
HUD 연결: PlayerController BeginPlay에서 CreateWidget으로 HUD 생성 → AddToViewport → PlayerState/StatusComponent를 HUD에 바인드. HUDWidgetClass는 블루프린트에서 지정.
ProgressBar 갱신: MaxHP/CurrentHP가 바뀔 때마다 SetPercent(current/max). 0 나누기 방지로 MaxHP가 거의 0이면 0 처리. 값이 안 바뀌었으면 early return해서 불필요한 갱신 방지.
'학습 > Unreal' 카테고리의 다른 글
| 언리얼 사격 시스템 정리 (라인트레이스 사격, 연발, 부분 랙돌, 부위 판정) (0) | 2026.05.16 |
|---|---|
| 언리얼 C++ 모듈 추가 정리 (Module, Build.cs, ini Config, 비동기 로딩) (0) | 2026.05.16 |
| 언리얼 게임 데이터 관리 정리 (StatusComponent, PlayerState, GameInstance, DataTable) (0) | 2026.05.16 |
| 언리얼 Behavior Tree 노드 구현 핵심과 함정 (BTTask, Service, Decorator) (0) | 2026.05.16 |
| 언리얼 AI 기초 정리 (AIController, Behavior Tree, Blackboard) (0) | 2026.05.16 |
