C++ 팀 과제 TIL(1)

정완훈·2025년 2월 19일

오늘 만든 HUD

오늘 드디어 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++ 코드의 변수를 연결해줌! 이걸로 텍스트 블록을 제어할 수 있게 되는 거임.

CP_PlayerHUD.cpp (소스 파일)

#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()는 위젯이 생성된 후 초기화하는 부분인데, 지금은 특별히 할 일이 없지만, 나중에 위젯 바인딩이 제대로 되었는지 확인하는 코드를 넣거나, 초기화할 다른 내용이 생기면 여기서 처리하면 됨.

0개의 댓글