오늘 드디어 HUD 코드 마무리했다! (물론, 아직 다듬어야 할 부분은 있지만...😅)
CP_PlayerHUD.h (헤더 파일)
#pragma once // 헤더 파일 중복 방지
#include "CoreMinimal.h" // 언리얼 엔진 기본 클래스, 매크로 포함
#include "Blueprint/UserWidget.h" // UUserWidget 클래스 포함 (UI의 기본)
#include "Components/TextBlock.h" // TextBlock 클래스 포함 (텍스트 표시 위젯)
#include "CP_PlayerHUD.generated.h" // UCLASS() 매크로 관련 코드
UCLASS() // 언리얼 엔진 클래스 선언
class CYBERPUNK_API UCP_PlayerHUD : public UUserWidget // UUserWidget 상속
{
GENERATED_BODY() // UCLASS() 매크로 자동 생성 코드
public:
UCP_PlayerHUD(const FObjectInitializer& ObjectInitializer); // 생성자
UFUNCTION(BlueprintCallable, Category = "HUD") // 블루프린트에서 호출 가능
void UpdateHUD(int32 Wave, const FString& WeaponName, int32 Ammo, int32 Health, int32 EnemiesRemaining); // HUD 업데이트 함수
protected:
virtual void NativeConstruct() override; // 위젯 생성 후 초기화
UPROPERTY(meta = (BindWidget)) // 위젯 바인딩
UTextBlock* WaveText; // 웨이브 텍스트
UPROPERTY(meta = (BindWidget)) // 위젯 바인딩
UTextBlock* WeaponNameText; // 무기 이름 텍스트
UPROPERTY(meta = (BindWidget)) // 위젯 바인딩
UTextBlock* AmmoText; // 탄약 텍스트
UPROPERTY(meta = (BindWidget)) // 위젯 바인딩
UTextBlock* HealthText; // 체력 텍스트
UPROPERTY(meta = (BindWidget)) // 위젯 바인딩
UTextBlock* EnemiesRemainingText; // 남은 적 텍스트
};
#pragma once: 헤더 파일 중복 방지! 필수!#include: 필요한 헤더 파일 포함. UUserWidget, TextBlock 등 UI 관련 클래스들.UCLASS(): 언리얼 엔진 클래스라고 선언하는 거.UCP_PlayerHUD: 클래스 이름. UUserWidget 상속받아서 만듦.GENERATED_BODY(): UCLASS 매크로가 자동으로 생성해주는 코드.UCP_PlayerHUD(): 생성자.UpdateHUD(): 핵심 함수! 웨이브, 무기 이름, 탄약, 체력, 남은 적 수를 받아서 HUD에 표시해줌. BlueprintCallable 덕분에 블루프린트에서도 호출 가능!NativeConstruct(): 위젯이 생성된 후 초기화 작업하는 함수.UPROPERTY(meta = (BindWidget)): 핵심 of 핵심! 위젯 블루프린트의 텍스트 블록이랑 C++ 코드의 변수를 연결해줌! 이걸로 텍스트 블록을 제어할 수 있게 되는 거임.#include "CP_PlayerHUD.h"
#include "Components/TextBlock.h"
UCP_PlayerHUD::UCP_PlayerHUD(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
void UCP_PlayerHUD::NativeConstruct()
{
Super::NativeConstruct();
}
void UCP_PlayerHUD::UpdateHUD(int32 Wave, const FString& WeaponName, int32 Ammo, int32 Health, int32 EnemiesRemaining)
{
if (WaveText) // 텍스트 블록이 유효한지 확인! 중요!
{
WaveText->SetText(FText::AsNumber(Wave)); // 텍스트 설정
}
if (WeaponNameText)
{
WeaponNameText->SetText(FText::FromString(WeaponName));
}
if (AmmoText)
{
AmmoText->SetText(FText::AsNumber(Ammo));
}
if (HealthText)
{
HealthText->SetText(FText::AsNumber(Health));
}
if (EnemiesRemainingText)
{
EnemiesRemainingText->SetText(FText::AsNumber(EnemiesRemaining));
}
}
#include: 필요한 헤더 파일 포함.UCP_PlayerHUD(): 생성자. (지금은 특별한 내용 없음)NativeConstruct(): (지금은 특별한 내용 없음)UpdateHUD(): 각 텍스트 블록에 값을 설정해주는 부분. if (WaveText) 처럼 텍스트 블록이 유효한지 확인하는 거 잊지 말기! 안 그럼 뻑날 수 있음.핵심은 UPROPERTY(meta = (BindWidget))로 C++ 코드랑 위젯 블루프린트의 텍스트 블록을 연결하고, UpdateHUD() 함수에서 이 연결된 텍스트 블록에 값을 넣어주는 거다! NativeConstruct()는 위젯이 생성된 후 초기화하는 부분인데, 지금은 특별히 할 일이 없지만, 나중에 위젯 바인딩이 제대로 되었는지 확인하는 코드를 넣거나, 초기화할 다른 내용이 생기면 여기서 처리하면 됨.