C++와 WBP 사이의 UI 계약
BindWidget으로 동작과 디자인을 분리하기
본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.
Unreal UI를 C++로 만든다고 해서 Widget Blueprint를 전부 없앨 필요는 없다. ProjectTB에서는 C++가 동작을 담당하고 WBP는 레이아웃과 스타일을 담당하는 계약으로 나눴다.
BindWidget은 이름 계약이다
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UTextBlock> UnitNameText;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> SettingsButton;
WBP 안에 같은 이름과 호환되는 타입의 위젯이 있으면 자동으로 연결된다. BindWidget은 반드시 존재해야 하고, BindWidgetOptional은 없어도 C++ 생성이 실패하지 않는다.
점진적으로 UI를 고치는 프로젝트라면 Optional 계약이 유용하다. 대신 C++에서 포인터를 사용하기 전에 반드시 검사해야 한다.
if (UnitNameText)
{
UnitNameText->SetText(Unit->GetDisplayName());
}
WBP가 데이터를 계속 Polling하지 않게 한다
Tick마다 WBP가 GameMode를 찾아 체력과 돈을 읽게 만들면 데이터 흐름을 추적하기 어렵다. C++ 상태가 바뀌는 시점에 Widget의 갱신 함수를 호출하는 편이 분명하다.
전투 상태 변경
↓
C++ 검증 완료
↓
RefreshBattleState()
↓
연결된 TextBlock 갱신
계약 문서를 같이 둔다
ProjectTB의 WBP_MainHUD_Contract.md에는 SelectionSwitcher, HoverUnitNameText, TimelineText 같은 정확한 이름과 타입이 적혀 있다. WBP 작업자는 C++ 전체를 읽지 않고도 어떤 위젯을 만들어야 하는지 알 수 있다.
C++와 Blueprint 사이의 문제는 어느 쪽이 더 좋은가가 아니다. 이름, 타입, 호출 방향, 없어도 되는 위젯을 명시하지 않았을 때 문제가 생긴다.