본문 바로가기

언리얼5/언리얼5 개발

UE 헤드업 디스플레이 (공부 정리)

헤더 디스플레이 (HUD)

플레이어 컨트롤러에 의해 제작되고 관리되는 UI를 의미한다.

위젯을 생성하고 이를 플레이어 뷰포트에 띄우는 과정으로 생성된다.

이렇게 만들어진 위젯은 자신을 소유한 플레이어 컨트롤러에 접근할 수 있다.

 

주요 기능

1. CreateWidget() HUD위젯을 생성한다 생성 클래스는 플레이어 컨트롤러 클래스이다.

2. GetOwningPlayer() 플레이어 정보를 가져온다 HUD에서 컨트롤러에게서 가져온다 

 

기존 위젯클래스와는 달리 직접 함수로 데이터를 가져오는 위젯을 만들것이기에

BaseWidget을 사용하지않고 UserWidget을 상속받는 새 클래스 HUD를 만들어준다


 플레이어 컨트롤러 디자인

구현을 위해서 HUD 클래스와 오브젝트 레퍼런스 2개가 모두 필요하다

// HUD Section
protected:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = HUD)
	TSubclassOf<class UABHUDWidget> ABHUDWidgetClass;

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = HUD)
	TObjectPtr<class UABHUDWidget> ABHUDWidget;

 

스탯정보 View 위젯

WBP_CharacterStat - UserWidget 상속

 

텍스트의 이름들로 클래스에서 접근하여 사용 스탯데이터 텍스트들은 별도의 이름을 지정

 

UI 디자인 꿀팁 기능

 

다수의 UI 객체가 상위 Ui의 사이즈를 균일한 사이즈로 나누고싶을때 Fill을 클릭하면 한번에 나눌수있다.

 

컴포턴트 초기화 우선순위 낮은 숫자 부터 가장 먼처 호출

  1. initalizeComponent(컴포넌트) 
  2. postinitalizeComponents(액터)
  3. BeginPlay(컴포넌트) ,BeginPlay(액터)
  4. CreateWidget(엑터) -> NativeOnInitalized(Ui위젯)
  5. AddCompoViewport(엑터)-> NativeContruct(Ui위젯)

IntializeComponenet 함수를 사용하기위해서는

bWantsInitalizeComponenet = true 를 반드시 넣어줘야 호출이 가능하다


스텟데이터 UI와 동기화 방법

UserWidget 상속받는 클래스 생성

 

//다른 데이터들의 초기화가 완료된 이후 사용하는 위젯이기에 NativeConstruct를 사용한다.
void UABHUDWidget::NativeConstruct()
{
	Super::NativeConstruct();

	HpBar = Cast<UABHpBarWidget>(GetWidgetFromName(TEXT("WidgetHpBar")));
	ensure(HpBar);

	CharacterStat = Cast<UABCharacterStatWidget>(GetWidgetFromName(TEXT("WidgetCharacterStat")));
	ensure(CharacterStat);

	IABCharacterHUDInterface* HUDPawn = Cast<IABCharacterHUDInterface>(GetOwningPlayerPawn());
	if (HUDPawn)
	{
		HUDPawn->SetupHUDWidget(this);
	}

}

 

 

HUD 스탯 변경이벤트가 발생하면 업데이트 되게끔 Delegate 구현

DECLARE_MULTICAST_DELEGATE_TwoParams(FOnStatChangedDelegate, const FABCharacterStat& /*BaseStat*/, const FABCharacterStat& /*ModifierStat*/);
FOnStatChangedDelegate OnStateChanged;

FORCEINLINE void SetBaseStat(const FABCharacterStat& InBaseStat) { BaseStat = InBaseStat; OnStatChanged.Broadcast(GetBaseStat(), GetModifierStat()); }
	
FORCEINLINE void SetModifierStat(const FABCharacterStat& InModifierStat) { ModifierStat = InModifierStat; OnStatChanged.Broadcast(GetBaseStat(), GetModifierStat()); }

 

 

void UABCharacterStatComponent::SetLevelStat(int32 InNewLevel)
{
	CurrentLevel = FMath::Clamp(InNewLevel, 1, UABGameSingleton::Get().CharacterMaxLevel);
	SetBaseStat(UABGameSingleton::Get().GetCharacterStat(CurrentLevel));
	check(BaseStat.MaxHp > 0.0f);
}

사용 예시

void AABCharacterPlayer::SetupHUDWidget(UABHUDWidget* InHUDWidget)
{
	if (InHUDWidget)
	{
		InHUDWidget->UpdateStat(Stat->GetBaseStat(), Stat->GetModifierStat());
		InHUDWidget->UpdateHpBar(Stat->GetCurrentHp());

		Stat->OnStatChanged.AddUObject(InHUDWidget, &UABHUDWidget::UpdateStat);
		Stat->OnHpChanged.AddUObject(InHUDWidget, &UABHUDWidget::UpdateHpBar);
	}
}

'언리얼5 > 언리얼5 개발' 카테고리의 다른 글

UE Fade 기능 만들기  (2) 2024.04.06
GA 유용한 가상 함수  (0) 2024.03.31
UE Hpbar 만들기  (0) 2024.03.29
UE 아이템 시스템 (공부 정리)  (0) 2024.03.24
UE5 향상된 입력 Unreal C++ 에서 사용방법  (0) 2024.03.22