[Unreal] 18.UI_HUD

본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다

UI

  • 수업 내용
    • Player HUD 생성 및 적용
      • 델리게이트를 활용해서 AddHP() 함수 작성
    • 렌더 타깃을 활용해 FaceImage 등록
    • 캐릭터 인포 HUD 위젯 (상단 이름 및 체력바) 생성 및 적용

HUD

Head-Up Display

PlayerHUDWidget.cpp

#include "PlayerHUDWidget.h"
#include "../../Player/InGamePlayerState.h"

void UPlayerHUDWidget::NativeOnInitialized()
{
	Super::NativeOnInitialized();

	mCharacterImage = Cast<UImage>(GetWidgetFromName(TEXT("CharacterImage")));
	mNameText = Cast<UTextBlock>(GetWidgetFromName(TEXT("NameText")));
	mHPBar = Cast<UProgressBar>(GetWidgetFromName(TEXT("HPBar")));
	mMPBar = Cast<UProgressBar>(GetWidgetFromName(TEXT("MPBar")));

	UE_LOG(UE20241, Warning, TEXT("NativeOnInitialized"));

	AInGamePlayerState* State = GetOwningPlayerState<AInGamePlayerState>();

	if (IsValid(State))
	{
		State->AddHPDelegate<UPlayerHUDWidget>(this, &UPlayerHUDWidget::SetHPPercent);
	}
}

void UPlayerHUDWidget::NativeConstruct()
{
	Super::NativeConstruct();

	UE_LOG(UE20241, Warning, TEXT("NativeConstruct"));
}

void UPlayerHUDWidget::SetNameText(const FString& Name)
{
	mNameText->SetText(FText::FromString(Name));
}

void UPlayerHUDWidget::SetHPPercent(float Percent)
{
	mHPBar->SetPercent(Percent);
}

void UPlayerHUDWidget::SetMPPercent(float Percent)
{
	mMPBar->SetPercent(Percent);
}

InGamePlayerState.cpp

  • HUD 띄우기
    • 플레이어 스테이트에 존재하는 GetPlayerController() 함수를 사용하는 InGamePlayerController 타입으로 형변환 한 후 BeginPlay() 함수 안에서 받아온다
    • Controller가 존재하면, GetMainWidget()을 통해 메인 위젯을 가져오고 MainWidget에 할당한다
    • MainWidget 존재하면, GetPlayerHUD()를 통해 PlayerHUDWidget 값에 HUD값을 할당한다
    • PlayerHUD값에 이름 할당
  • HP, MP등의 상태값을 PlayerState에서 가지고 있기 때문에, TakeDamage() 함수를 수정
    • class AInGamePlayerState/*를 헤더에서 선언한 후, BeginPlay()에서 초기화 및 할당
    • InGameState 클래스에 AddHP() 함수를 만들고, 감소는 음의 값을 집어 넣어서 처리
      • MaxHP를 넘으면 HP를 MaxHP에 고정하는 처리 해주기
      • HP가 0보다 작아지면 죽음처리
    • 체력의 변화가 있을 때마다 AddHP() 함수가 호출 된다
      • 퍼블릭으로 선언하면 아무데서나 끌어와서 사용할 수 있지만, 어디서 호출해서 어떻게 변화시키는지 찾기가 너무 힘들다 (디버깅이 힘듬)
      • Delegate를 사용해서 HP값의 변화가 일어날 때마다 멀티 캐스트 타입으로 HPDelegate를 선언(GameInfo.h에 선언)하고, 함수를 등록한다
        • 예를들어 타겟팅하고 있는 몬스터의 체력 감소 바를 HUD로 만들어 주기 위해서는 위 함수를 MonsterPawn에서도 사용을 할 수 있어야 한다
        • 따라서 GameInfo.h에 델리게이트를 선언하고 범용적으로 사용한다
      • 객체주소와 함수주소를 넘겨줘서 AddHPDelegate() 함수 작성
      • 사용될 곳에 함수 등록하는 것 만으로 AddHP 함수를 호출해 주는 로직 작성 가능 (매번 인스턴스를 생성하고, 할당하여 함수를 호출할 필요가 없다)
    • 렌더 타깃을 활용하여 HUD에 FaceImage 삽입
  • AddHP()의 경우 체력 변화가 있을 때 마다 계속 호출이 되서 상관없지만, Name의 경우 호출 순서에 따라 초기 생성 시 초기화가 안될 수 있다 (호출 순서에 따라 원하는 결과를 얻지 못할 수 도 있다)
    • PlayerCharacterBeginPlay()에서 인포 위젯을 형변환을 통해 InfoHUD를 할당하고, InGamePlayerState 타입의 GetPlayerState()를 통해 GetName() 함수를 호출한다
  • AIPawn에도 적용할 수 있고, AIPawn은 컴포넌트만 가지고 있고, MonsterPawn에서 재정의해서 InfoHUD를 사용할 수 있다

© 2023 Jinsoo Lee. All rights reserved.

Powered by Hydejack v9.1.6