UE5- UI시스템 구축하기

haura·2025년 5월 1일
0

UE5

목록 보기
18/21

🔧 전체 구조 요약

  • AttributeSet: 체력, 최대체력, 마나 등 정의
  • WidgetController(Base) : 데이터 전달 담당
  • OverlayWidgetController(Child) 오버레이 전용 기능 담당
  • UserWidget : 위젯에서 컨트롤러 참조
  • 델리게이터 사용 : WidgetController -> Widget으로 데이터 전달

WidgetController를 사용하는 이유

위젯에서 직접 PlayerState, AbilitySystemComponent등에 접근하면 강한 의존성과 UI 재사용성 저하 문제가 발생한다
-> UI와 데이터 게층을 분리해여 UI는 컨트롤러에게만 의존하고 컨트롤러는 실제 데이터에 접근하게 한다.

Attribute 초기화 흐름

  1. OverlayWidget이 생성되면 HUD에서 OverlayWidgetController 생성
  2. SetWidgetController()로 위젯에 컨트롤러 생성
  3. 위젯의 Event WidgetControllerSet가 블루프린트에서 호출됨
  4. 이 시점에서 Delegate 바인딩 진행
  5. 위젯 컨트롤러에서 BroadcastInitialValues() 호출 → Delegate 실행
  6. 위젯이 값 전달받아 UI 업데이트

Delegate란?

델리게이트 = 이벤트 신호 시스템(일종의 콜백 함수 리스트)
언리얼에서는 UI에서 많이 사용되며 컨트롤러->위젯으로 데이터 전달 시 직접 접근 없이 동작을 트리거 할 수 있다.

델리게이트 선언(헤더파일)

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangedSignature, float, NewHealth);

UPROPERTY(BlueprintAssignable, Category="GAS|Attributes")
FOnHealthChangedSignature OnHealthChanged;

-> 위젯에서는 Assign OnHealthChanged로 바인딩 가능
델리게이트 사용(cpp파일)

void UOverlayWidgetController::BroadcastInitialValues()
{
	const UAuraAttributeSet* AuraAttributeSet = CastChecked<UAuraAttributeSet>(AttributeSet);

	OnHealthChanged.Broadcast(AuraAttributeSet->GetHealth());
	OnMaxHealthChanged.Broadcast(AuraAttributeSet->GetMaxHealth());
}

🔍 Cast vs CastChecked

  1. Cast<>
  • 실패 시 nullptr 반환
  • 유연하지만 체크 안하면 런타임 크래시 위험 발생
  1. Castchecked<>
  • 실패 시 바로 크래시 발생
  • 개발 중 "무조건 있어야 할 객체" 강제 보장
  • 의도한 클래스가 아닌 경우 즉시 알 수 있어 디버깅에 효과적임

0개의 댓글