[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 삽입
- class AInGamePlayerState/*를 헤더에서 선언한 후,
AddHP()의 경우 체력 변화가 있을 때 마다 계속 호출이 되서 상관없지만, Name의 경우 호출 순서에 따라 초기 생성 시 초기화가 안될 수 있다 (호출 순서에 따라 원하는 결과를 얻지 못할 수 도 있다)- PlayerCharacter의
BeginPlay()에서 인포 위젯을 형변환을 통해 InfoHUD를 할당하고, InGamePlayerState 타입의GetPlayerState()를 통해GetName()함수를 호출한다
- PlayerCharacter의
- AIPawn에도 적용할 수 있고, AIPawn은 컴포넌트만 가지고 있고, MonsterPawn에서 재정의해서 InfoHUD를 사용할 수 있다