언리얼 엔진
Unreal UI - 범용 버튼 UI 컴포넌트 구축기
로안님
2025. 5. 14. 23:17
서론
게임 개발에서는 반복적으로 사용되는 UI 요소의 재사용성과 커스터마이즈 가능성이 매우 중요합니다. 이번 글에서는 디자이너의 편의성, 런타임 유연성, 성능 최적화를 모두 고려한 범용 C++ 커스텀 버튼 위젯 시스템 구축 과정을 공유합니다. 해당 시스템은 블루프린트와 C++ 간의 경계를 효과적으로 넘나들며, 실시간 디자인 반영과 성능 최적화를 모두 만족합니다.
✅ 전체 작업 요약: C++ 커스텀 버튼 위젯 시스템 구축
1️⃣ UCustomButtonWidget 클래스 생성
- 부모 클래스: UUserWidget
- 위젯 바인딩: ButtonMain, TextMain
- 기본 틀 구성: 디자이너가 시각적으로 작업할 수 있도록 최소한의 바인딩 요소 구성
2️⃣ 핵심 사용자 설정 변수 설계
디자이너와 런타임 모두 대응 가능한 구조를 위해 모든 변수는 EditAnywhere, ExposeOnSpawn=true 설정:
UPROPERTY(EditAnywhere, BlueprintReadWrite, ExposeOnSpawn)
FText ButtonText;
UPROPERTY(EditAnywhere, BlueprintReadWrite, ExposeOnSpawn)
bool bShowText;
UPROPERTY(EditAnywhere, BlueprintReadWrite, ExposeOnSpawn)
FSlateColor TextColor, ButtonColor;
UPROPERTY(EditAnywhere, BlueprintReadWrite, ExposeOnSpawn)
int32 FontSize;
UPROPERTY(EditAnywhere, BlueprintReadWrite, ExposeOnSpawn)
ETextJustify::Type TextJustification;
UPROPERTY(EditAnywhere, BlueprintReadWrite, ExposeOnSpawn)
FSlateBrush NormalStyle, HoveredStyle, PressedStyle;
UPROPERTY(EditAnywhere, BlueprintReadWrite, ExposeOnSpawn)
USoundBase* ClickSound;
UPROPERTY(EditAnywhere, BlueprintReadWrite, ExposeOnSpawn)
USoundBase* HoverSound;
3️⃣ 위젯 초기화 함수
- ApplyText(): 텍스트, 폰트 크기, 색상, 정렬 적용
- ApplyStyle(): 슬레이트 브러시 기반 버튼 스타일 설정
- HandleClicked() / HandleHovered(): 사운드 재생 및 디스패처 호출
4️⃣ 버튼 디스패처 이벤트 설계
외부에서 이벤트 바인딩이 가능한 구조:
UPROPERTY(BlueprintAssignable)
FOnButtonClickedEvent OnCustomClicked;
5️⃣ NativePreConstruct() 활용
디자이너가 위젯 에디터 상에서 실시간으로 설정값 확인 가능:
virtual void NativePreConstruct() override
{
Super::NativePreConstruct();
ApplyText();
ApplyStyle();
}
6️⃣ 블루프린트 확장: WBP_CustomButton
- C++ 기반 위젯을 상속받은 블루프린트 생성
- 디자이너가 Details 패널에서 직접 텍스트/색상/폰트/정렬/이미지/사운드 설정
- 다른 UI에 드래그&드롭으로 손쉽게 배치 가능
🎯 결과 요약 테이블
항목 상태
디자이너 실시간 적용 | ✅ NativePreConstruct() 반영 완료 |
런타임 커스터마이즈 | ✅ ExposeOnSpawn 완비 |
재사용성 | ✅ 완전 범용 위젯 구조 |
사운드 반응 | ✅ 클릭/호버 별도 설정 가능 |
텍스트 설정 | ✅ 정렬/색상/폰트 크기 모두 지원 |
성능 | ✅ C++ 기반 최적화 설계 완료 |
마무리
이번에 제작한 커스텀 버튼 시스템은 반복적인 UI 작업을 획기적으로 단순화하고, 런타임과 디자인 타임 모두에서 유연성을 제공하는 구조입니다. 이 방식을 기반으로 다양한 범용 위젯 시스템으로 확장해 나갈 수 있으며, 프로젝트의 UI 퀄리티와 생산성 향상에 큰 도움이 될 것입니다.